Авто-релиз дважды объект

NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
str = @"hii";
NSLog(@"%@",str);      

Может ли кто-нибудь помочь мне рассказать об этом коде. Авто-освобождение объекта в два раза, что произойдет. Когда я запускаю код, я не получаю зомби. почему так.

2 ответа

Решение

Объект освобождается дважды, когда пул авто-релиза уничтожается, что, вероятно, будет в конце итерации цикла выполнения. Почему это не сбои в том, что NSString возвращает синглтоны для некоторых экземпляров, например, пустую строку, которую вы создаете, или строковые литералы (вы НЕ должны зависеть от этого, вот что в данный момент происходит!), эти объекты не будут освобождены, и поэтому вы не получите зомби,

Во-первых, нет причин вызывать авто-релиз дважды.

Как только объект помечен как autorelease, повторный вызов autorelease будет просто проигнорирован. См. Https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsautoreleasepool_Class/Reference/Reference.html.

Но в опубликованном вами примере вы создаете пустую строку:

NSString *str = [[[[NSString alloc]init]autorelease]autorelease];

Затем вы назначаете ему другую строку:

str = @"hii";

Это означает, что первая выделенная строка будет просто утечкой, вы выполнили ее автоматическое освобождение, чтобы она была очищена в конце. Но нет причин выделять строку в первое место.

Вы могли бы просто сделать:

NSString *str =@"hii";
NSLog(@"%@",str);
Другие вопросы по тегам