我在iOS(4)中苦苦挣扎,在一个范围内分配对象并在另一个范围内释放它。我使用属性作为对象的指针。在一个实例类方法中分配和初始化对象,然后在类的dealloc方法中释放它。使用retain声明属性。除了使用像这样的属性的问题,我还发现分配和初始化对象并设置属性很麻烦。
NSObject *object = [[NSObject alloc] init];
Self.myProperty = object;
[object release];
我试过
self.myObject = [[NSObject alloc] init];
然而,这给了我内存泄漏。
我的问题:我是否必须制作此临时对象,或者是否有更优雅的方式来执行此操作?
后续问题:我是否必须将属性设置为nil并释放自动生成的ivar?
[self setMyProperty:nil], [myProperty release];
当XCode 4为你生成属性存根时,它会在viewDidUnload中放置[self setMyProperty:nil],在dealloc中放置[_myProperty release]。
答案 0 :(得分:2)
第一个问题:
autorelease
是你的朋友:
self.myObject = [[[NSObject alloc] init] autorelease];
第二个问题:
不,这是多余的,但无害,因为第二次操作无效([nil release]
是安全的)。
我建议使用self.XXX = nil;
构造,因为它更安全,更清晰/可读。
答案 1 :(得分:1)
自我。符号正在运行合成的setter,它执行retain,这就是你需要在init对象上进行自动释放的原因。相反,你可以放弃自我。并且只需使用
myObject = [[NSObject alloc] init;
这一行只是将myObject指针设置为保留对象,你就不会有任何泄漏。
以前我的问题与你的问题一样:
MKReverseGeocoder autorelease/release question in Apple's CurrentAddress sample