关于使用非原子和保留财产

时间:2012-02-15 06:09:20

标签: iphone objective-c ios

我在AppDelegate中有一个NSMutableArray 我正在使用财产(非原子,保留) 并合成它

再次在didfinishlaunch中使用 [[nsmutablearray alloc] init]分配;

所以,我怀疑的是,如果我使用发布方法在deallloc中发布它。 它发布得当吗? 或仍然保留计数。 如果我做错了,请提供适当的解决方案。

5 个答案:

答案 0 :(得分:4)

这取决于你如何分配它。如果您的作业直接指向ivar,例如

myProperty = [[NSMutableArray alloc] init];

然后dealloc中的单个版本就足够了,因为你在alloc中的预期保留计数为1。

另一方面,如果您通过以下任一方式使用了合成设定器:

[self setMyProperty:[[NSMutableArray alloc] init]];

self.myProperty = [[NSMutableArray alloc] init];
然后你几乎肯定泄露了这个物体。您将保留计数增加了两次(一次通过alloc,一次通过设置器)并且只递减一次(在dealloc中)。

最佳IMO是使用setter和autorelease池:

self.myProperty = [[[NSMutableArray alloc] init] autorelease];

这里alloc与本地自动释放平衡,并且setter的保留与dealloc释放平衡。

虽然该方法涉及两个额外的方法(setter方法和autorelease调用),但它确保以前在属性中设置的任何保留值都是release d(如果需要)(在setter方法中)。

答案 1 :(得分:0)

是的,你还需要在dealloc中发布它。 这两个页面是iOS / Cocoa开发人员关于内存管理的必读内容

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

有关您的具体示例,请参阅第二个链接部分“实施dealloc以放弃对象的所有权”

以下是Stack Overflow上解决此问题的链接: Understanding reference counting with Cocoa and Objective-C

答案 2 :(得分:0)

如果您执行以下操作:

my_property = [[NSMutableArray alloc] init];

'my_property'假定您的数组的所有权。你的类的dealloc方法必须释放数组以防止泄漏。

[my_property release];

-OR -

self.my_property = nil;

答案 3 :(得分:0)

如果您正在使用

[self setMutableArray:[[nsmutablearray alloc] init]];

在这种情况下,它将释放先前分配给它的任何内存(放弃所有权)。 所以在dealloc方法中你很简单 写作

self.mutableArray = nil; 

那么它将放弃所有权,并且分配给mutableArray的内存将自动释放

答案 4 :(得分:0)

在您的情况下,保留计数将为2并且数组将继续释放。设置属性后,无需初始化它。