内存管理Objective-C问题

时间:2011-07-23 19:51:05

标签: iphone objective-c cocoa-touch memory-management

因此假设我声明了一个对象并为其创建了一个合成的保留属性。所以在头文件中有类似的东西:

NSArray *array;
@property (retain)....

合成后,我在dealloc中调用了release

现在在init方法中,如果我还要动态分配该数组,我该怎么做才能释放它?所以: array = [[NSArray alloc] initWithObjects...

如果班级在没有泄漏的情况下运行,如何保留对象?

谢谢

3 个答案:

答案 0 :(得分:3)

self.array = [[[NSArray alloc] initWithObjects:...] autorelease];

NSArray *newArray = [[NSArray alloc] initWithObjects:...];
self.array = newArray;
[newArray release];

使用这两个选项,您还必须在dealloc中调用[array release];

通过使用其setter方法,您通常不必担心保留和释放。

答案 1 :(得分:1)

所有init*initinitWith...等)方法都会返回保留的对象。另一方面,某些类提供的便捷构造函数提供 not 保留的对象 - 或者更确切地说,保留,然后自动释放。

更多here

所以你通过init方法为你的ivar分配一个保留对象,然后在dealloc中释放它来做正确的事。

对于对象生命周期的其余部分,只使用合成的访问器是明智的,因为它们会保留和释放。

总而言之,你很好。

答案 2 :(得分:0)

为了利用属性的优点,您需要在变量名前加上self。

array = [[NSArray alloc] initWithObjects:...];

不同
self.array = [[[NSArray alloc] initWithObjects:...] autorelease];

前者将数组直接分配给实例变量。后者将调用合成的setArray方法,该方法允许您免费保留/释放。如果您决定在类的生命周期中的任何其他时间点为数组分配新引用,这将非常有用。