这是保留还是自动释放对象?

时间:2011-09-15 16:56:50

标签: iphone ios ios4 nsmutablearray memory-management

我在我的类的标题中声明了一个MutableArray rqst_entries 作为属性并合成它。 在viewdidload中,我添加了以下代码:

self.rqst_entries = [NSMutableArray array];

它是否会将此ivar变为自动释放并且可能更早发布(在调用dealloc之前)

求助,

的Stephane

4 个答案:

答案 0 :(得分:5)

如果您已将自己的财产定义为retaincopy,那么它将由ivar持有,您将没事。另一方面,如果您将属性定义为assigned,则会因为[NSMutableArray array]自动释放而遇到问题。

答案 1 :(得分:3)

如果您的媒体资源为retaincopy,则不会。

答案 2 :(得分:3)

如果您的财产被保留,那么您没事。您已为自己的财产分配了一个自动释放的对象,但此操作已为您保留了该对象。

答案 3 :(得分:1)

[NSMutableArray array]返回一个自动释放的对象。

每个人的答案都与财产rqst_entries有关。基本上,您需要一个内存模型为retain的属性。在某些情况下,您可能希望使用copy,但这通常用于不可变类型(NSArray,NSString等)。 NSMutableArray是可变的(您可以添加条目,删除条目和修改数组中的条目)。

您想要定义您的属性,如:

@property (nonatomic, retain) NSMutableArray *rqst_entries;

真正引起人们兴奋的部分是在属性分配中执行alloc / copy / retain,如:

self.rqst_entries = [[NSMutableArray alloc] init];

因为除非后续发布

,否则会泄漏
[self.rqst_entries release];

在这种情况下,分配的最佳方法是使用局部变量(至少在需要线程安全时)。像:

NSMutableArray *myArray = [[NSMutableArray alloc] init;
self.rqst_entries = myArray;
[myArray release];

我意识到这是一个非常简单的例子,但它确实说明了这一点。