live13 (live13) wrote,
live13
live13

Category:

Чудеса и таинства Objective C



Знакомство с языком 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. реальный код принести домой забыл. Так что пишу по памяти и к каким-либо синтаксическим ошибкам в коде придирться бесполезно.
Tags: mac, забавное, игры
Subscribe

promo live13 may 11, 2014 17:58 46
Buy for 50 tokens
Примерно неделю назад я писал, что заинтересовался этой online-книжкой http://gameprogrammingpatterns.com/ и решил сделать ее перевод. Сам я мог бы ограничиться и английским вариантом, но думаю многим перевод пригодится. В прошлом я уже занимался переводом книг. Не как основной работой. Так,…
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments