2010-09-08 2 views
0

У меня есть этот userInputstring в заголовке, который будет изменен и использоваться несколькими способами в .m файлПростой проблемы с NSString

.h 
NSString *userInputString; 
    -(void)main; 
    -(void)method1; 
    -(void)method2; 

.m 
    -(void)main{ 
    [self method1]; 
    [self method2]; 

    } 


    -(void)method1{ 
    NSString *localString = @"something"; 
    userInputString = localString; 
    //do something else with it 
    } 


    -(void)method2{ 
    NSString *localString = [NSString stringWithFormat:@"%@ insert something",userInputString]; 
    userInputString = localString; 
    [someOtherMethod:userInputString];//Crash 
    } 

, но я постоянно получаю проблемы утечки памяти. Каков правильный способ его настройки? Im новое к объективному c.

+0

Вы можете отправить сообщение об ошибке –

+0

нет сообщения об ошибке, просто память утечка. нашел его с помощью инструментов. – Fasid

+1

Вы должны показать, как вы создаете строку и как ее выпускаете, если вы вообще это делаете. В противном случае мы не можем знать, что не так – willcodejavaforfood

ответ

2

Я не знаю, где и как освободить

право, в первую очередь необходимо ознакомиться с Cocoa Memory Management Rules.

Таким образом, если вы получаете объект путем выделения, метод, содержащий «копию», метод, начинающийся с «нового», или если вы его сохраняете, вам необходимо освободить или автообновить.

Take method1:

-(void)method1{ 
    userInputString = @"something"; 
    } 

userInputString не был получен с Alloc, новой или копии, ни вы сохранили его. Поэтому вы не владеете им, поэтому не должны его выпускать. Если вы сделали это:

userInputString = [@"foo" copy]; 

или это:

userInputString = [[NSString alloc] initWithString: @"foo"]; 

или это:

userInputString = [@"foo" retain]; 

вы владеете строку поэтому вы должны освободить или autorelease его.

Когда вы отпускаете его, это зависит от его объема. Если это локальная переменная, вы должны ее освободить или автообновить до того, как блок будет объявлен в выходы. Если это переменная экземпляра, вы должны освободить ее до того, как объект, в котором он находится, освобождается. то есть вы должны освободить его в методе dealloc для объекта. Во всех случаях, если вы перезаписываете объект, который у вас есть, вы должны его сначала отпустить. Итак:

userInputString = [someOtherString copy]; // you own userInputString 

// do some stuff 

[userInputString release];     // you no longer own it 
userInputString = [someOtherString retain];// overwrite the pointeer with something else 

Это одна из причин добавления геттеров и сеттеров для переменных экземпляра. Каждый раз, когда вы устанавливаете новое значение, вы должны выпустить старое значение и сохранить новое значение (убедитесь, что значение старого значения bvalue и новое значение различны), поэтому он инкапсулирован в сеттер. Синтетическое свойство автоматически добавляет этот код.

+0

@JeremyP благодарит за подробный ответ. Я все еще запутался в последнем примере кода и последнем абзаце в вашем ответе. Поэтому, если я создаю свойство userInputString. @property (nonatomic, copy) NSString * userInputString в файле .h, что мне нужно делать каждый раз, когда я устанавливаю его в значение локальной строки в методе? Это просто userInputString = [someOtherString copy]? и свойство высвобождает значение, хранящееся в данный момент, и принимает новое значение? – Fasid

+1

@Fasid: вы пишете 'userInputString =', вы не используете свойство accessor, вы просто устанавливаете переменную экземпляра. Это должно быть 'self.userInputString =' или '[self setUserInputString:' для того, чтобы свойство было релевантным. – Chuck

+0

@chuck я вижу. как насчет управления памятью? Это то, что я сказал правильно? Мне нужно только освободить свойство в dealloc? – Fasid

0

Попробуйте использовать autorelease бассейн:

int main() 
{ 
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; 

    .... 
    // Your code here 

    [pool drain] 
    return 0; 
} 
0

@ "blablabl" является сокращенным чтобы создать autoreleased NSString с постоянной строки. Если, если у вас нет пула автозапуска в потоке, который вы используете, этот объект NSString никогда не будет выпущен, и, конечно же, вы создадите утечку.

Либо создайте авторешетку, так как Sumai предлагает или освобождает память объекта objet. (Подсказка: создать NSAutorelesePool ;-))

+1

Постоянные NSStrings, например. @ "foo" никогда не выпускаются даже с пулом автозапуска. – JeremyP

Смежные вопросы