NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
str = @"hii";
NSLog(@"%@",str);
谁能帮我介绍一下这段代码。自动释放对象两次会发生什么。当我运行代码时,我没有得到任何僵尸。为什么会这样。
NSString *str = [[[[NSString alloc]init]autorelease]autorelease];
str = @"hii";
NSLog(@"%@",str);
谁能帮我介绍一下这段代码。自动释放对象两次会发生什么。当我运行代码时,我没有得到任何僵尸。为什么会这样。
当自动释放池被销毁时,对象会被释放两次,这可能是在运行循环迭代结束时。为什么它不会崩溃,它会NSString
为某些实例返回单例,例如您创建的空字符串或字符串文字(您不应该依赖它,这正是当前发生的事情!),这些对象不会被释放,这这就是为什么你没有得到僵尸。
首先没有理由调用 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);