Objective-C: когда назначенный объект освобождается - PullRequest
0 голосов
/ 04 мая 2010

Если у меня есть метод экземпляра и в этом методе я делаю что-то вроде этого:

NSString *peopleString = [peopleList componentsJoinedByString: @", "];
...
UILabel *likeLabel = [[UILabel alloc] initWithFrame:CGRectMake(16.0+6.0f, 4.0f, 252.0f, 12.0f)];
[likeLabel setText:peopleString];
[likeLabel setFont:[UIFont fontWithName:@"Arial" size:12]];
[likeRow addSubview:likeLabel];
[likeLabel release];

componentsJoinedByString не содержит new, copy или alloc, поэтому мне не нужно его выпускать. Что мне интересно, так это то, что когда мой peopleString освобождается. Может ли это случиться рано? Смысл, прежде чем я смогу установить текст в моем ярлыке. Должен ли я лучше использовать [[NSString alloc] initWithString:[peopleList componentsJoinedByString: @", "]]; и выпустить его в конце этого метода?

Ответы [ 2 ]

1 голос
/ 04 мая 2010

Когда вы создаете peopleString, он получает счетчик ссылок 1. Позже, когда вы говорите likeLabel использовать peopleString для своего текста, счетчик ссылок peopleString увеличивается на 1. Теперь счетчик ссылок для peopleString равно 2. Когда освобождается likeLabel, предположительно в конце цикла событий, счетчик ссылок peopleString уменьшается на 1. Но ваш экземпляр peopleString также получает счетчик ссылок, уменьшенный на 1 через конец цикла событий. Так что peopleString теперь имеет счетчик ссылок 0 и удален из памяти.

См. # 6578 для лучшего объяснения.

1 голос
/ 04 мая 2010

Автоматически высвобождаемые объекты (например, " peopleString " в вашем коде) освобождаются пулом автоматического освобождения ( NSAutoreleasePool ), когда " сток"метод вызван.
AppKit создает автоматически освобождаемый пул в каждом цикле цикла событий и сливает его в конце.
Поэтому, пока выполняется код (например, в методе), объекты не будут освобождены.

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