Знакомство с языком Objective C и его использованием для разработки под iPad продолжается. Целую неделю думал где у меня ошибка? Почему правильно проинициализированная область памяти внезапно заполняется мусором? Оказалось все просто, но после C++ как то немного... парадоксально.
Есть у меня интерфейс
@interface Fraction: NSObject {
...
NSMutableArray * MyArray;
@end
Вот его реализация
- (id) init
{
...
MyArray = [[NSMutableArray alloc] init];
//добавляем элементы в MyArray
...
[self myFunc];
}
А теперь магия. Я никак не мог понять почему массив создается нормально, добавление элементов происходит нормально, в методе myFunc массив тоже ведет себя нормально. Но как только начинают работать обработчики тыканья пальцами, в массиве оказывается мусор!
Оказалось дело в локальной области видимости. То что MyArray по аналогии с C++ член класса - еще ничего не знает. По завершении метода init он получается исчезает и уже не является валидным. Чтобы этого избежать понадобилось добавить всего одну строчку после
MyArray = [[NSMutableArray alloc] init];
а именно
[MyArray retain];
Этот метод увеличивает счетчик ссылок на объект и по выходе из своей области видимости он не уничтожится. Теперь мой массив MyArray спокойно доживает до метода интерфейса dealloc, где спокойно удаляется с помощью release.
Вот такой он интересный, этот Objective C.
P.S. реальный код принести домой забыл. Так что пишу по памяти и к каким-либо синтаксическим ошибкам в коде придирться бесполезно.
Journal information