В зависимости от того, как вы используете две локальные переменные, вам может потребоваться дополнительное управление памятью.
При чтении кода вы устанавливаете локальные переменные для указателей, возвращаемых двумя объектами класса. Если вы написали классы newPlanet*
правильно, то строковые объекты должны быть освобождены при освобождении классов. Если ваши две локальные переменные затем попытаются использовать указатели, у вас возникнут проблемы, так как объекты больше не являются
Два возможных исправления:
1. Сохранить строки явно
Поскольку локальные переменные присваиваются напрямую, вы действительно должны были явно сохранять объекты:
planet_01_Geek = [[newPlanet_01 geekName] copy];
planet_02_Geek = [[newPlanet_02 geekName] copy];
Я указываю здесь копию, потому что это предпочтительный способ хранения объектов, которые могут изменяться, в противном случае, если оригинал изменится, локальная переменная также изменится.
2. Используйте свойства (предпочтительно)
Это мой предпочтительный метод: retain
, copy
или assign
для переменных экземпляра затем обрабатываются классом.
Объявите свойства правильно, то есть:
@property (nonatomic, copy) NSString *planet_01_Geek;
@property (nonatomic, copy) NSString *planet_02_Geek;
Используйте @synthesize
в реализации.
Затем используйте синтаксис свойства для распределения переменных.
self.planet_01_Geek = [newPlanet_01 geekName];
self.planet_02_Geek = [newPlanet_02 geekName];
Таким образом, правильные правила управления памятью будут применяться при назначении, а методы синтезированного метода доступа также позаботятся об освобождении любого объекта, который в настоящее время назначен локальным переменным.
Редактировать - примечание, поскольку показаны дополнительные сведения о классе
В вашем setGeekName:
методе вы теряете память. Когда вы выделяете новый указатель на локальную переменную, вы не отправляете релиз объекту, который был там раньше. Лучший способ сделать это (использовать retain
вместо copy
для простоты:
- (void)setGeekName:(NSString *)gName {
[gName retain]; // Hold on to the object that is passed in.
[geekname release]; // Let go of your current object.
geekName = gName; // Now allocate the new object.
}