выделить и выпустить проблемы - PullRequest
0 голосов
/ 07 августа 2011

Я не могу понять, почему мое приложение падает после нескольких раз, что я делаю:

potionsT неатомично, сохраняйте, только для чтения.

-(void)First:(NSString*)Potions {

    potionsT = [[NSString alloc] initWithString:Potions];
}

-(void)After:(NSString*)Potions {
    [potionsT release];
    potionsT = [[NSString alloc] initWithString:Potions];

Вы видите, ясначала звоню сначала и после этого звоню несколько раз после: и вайпы вылетает.с ECX_BAD_ACCESS .. Я довольно нуб, со всем этим, что касается управления памятью, я знаю это ... Спасибо!

Ответы [ 3 ]

3 голосов
/ 08 августа 2011

Суть сохраняемого свойства в том, что оно обрабатывает сохранение и разблокировку при его установке.

- (void)first:(NSString*)potions
{
    self.potionsT = potions; // will automatically release old value and retain new
}

- (void)after:(NSString*)potions
{
    self.potionsT = potions; // same as above
}

Также обратите внимание, как я переименовал ваши Potions в potions, First: в first:After: до after:.Соглашение об именовании в Objective-C состоит в том, чтобы начинать переменные и методы со строчной буквы, а имена классов - с заглавной.

2 голосов
/ 08 августа 2011

Если вы настроили potionsT как свойство, вы должны получить к нему доступ таким образом:

-(void)first:(NSString*)potions {
    self.potionsT = potions;
}

-(void)after:(NSString*)potions {
    self.potionsT = potions;
}

В обоих случаях я изменил ваш код, чтобы использовать аксессор для potionsT (вот чтоself.potionsT означает).Я также не создаю новую строку, а просто сохраняю предоставленную.Так как строки NSS неизменны, результат тот же.Однако для достижения наилучших результатов измените свойство potionT с retain на copy.Таким образом, если изменяемая строка будет передана, она будет скопирована, а не сохранена (а неизменяемые строки все равно будут сохранены).

2 голосов
/ 08 августа 2011

Вы @synthesize собственность в @implementation для класса? Если это так, то вы должны использовать:

self.potionsT = Potions;

если вы используете

potionsT = ...

тогда вы получаете доступ к ивару, а не к собственности. Чтобы получить доступ к свойству и позволить ему выполнять управление памятью за вас, перед ним должна быть ссылка на экземпляр, и это также может быть self.

Если вы используете свойство, вы не должны выпускать potionsT вручную, поскольку свойство уже делает это за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...