Авто-релиз дважды объект
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);