我在AppDelegate中有一个NSMutableArray 我正在使用财产(非原子,保留) 并合成它
再次在didfinishlaunch中使用 [[nsmutablearray alloc] init]分配;
所以,我怀疑的是,如果我使用发布方法在deallloc中发布它。 它发布得当吗? 或仍然保留计数。 如果我做错了,请提供适当的解决方案。
答案 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开发人员关于内存管理的必读内容
有关您的具体示例,请参阅第二个链接部分“实施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并且数组将继续释放。设置属性后,无需初始化它。