Ios 使用分配保留自我对象是否好
我正在做一些分配Ios 使用分配保留自我对象是否好,ios,objective-c,memory-management,autorelease,Ios,Objective C,Memory Management,Autorelease,我正在做一些分配 self.xyz = [[NSDictionary alloc] init]; 保留这样的财产是个好主意吗?或 这样做是否更好: NSDictionary *zzz = [[NSDictionary alloc] init]; self.xyz = zzz; [zzz release]; 我在这里关注的是,我看到了一些地方,比如: self.xyz = [[NSDictionary alloc] init]; 这意味着保留计数为2。那么,将计数减少到1的最佳方法是什么呢
self.xyz = [[NSDictionary alloc] init];
保留这样的财产是个好主意吗?或
这样做是否更好:
NSDictionary *zzz = [[NSDictionary alloc] init];
self.xyz = zzz;
[zzz release];
我在这里关注的是,我看到了一些地方,比如:
self.xyz = [[NSDictionary alloc] init];
这意味着保留计数为2。那么,将计数减少到1的最佳方法是什么呢
谢谢。只是想把一些内存管理概念弄清楚一点。以我的拙见
self.xyz = [NSDictionary alloc]
将导致内存泄漏。您需要手动释放
你可以这样做
xyz = [NSDictionary alloc]
在那之后,我也有同样的问题。哪种方法更好?为什么呢?我通常会这样做:
self.xyz = [[[NSDictionary alloc] init] autorelease];
或者,如果类有一个方便的方法,那么就这样使用它:
self.xyz = [NSDictionary dictionary];
或者,只需使用ARC并让它在本例中为您完成工作。这取决于您如何处理属性
xyz
。如果是的话
@property (nonatomic, retain) NSObject *xyz;
然后
xyz
在NSDictionary
上有一个保留,所以第二个(3行)版本是最好的。我假设我们讨论的是不使用ARC时的最佳实践
在手动内存管理环境中,第一种方法完全错误,因为正如您所指出的,保留计数为2。做一个班轮的正确方法如下:
self.xyz = [[[NSDictionary alloc] init] autorelease];
通过合成setter(假设用retain指令声明了xyz
),除了由alloc
/init
添加的1之外,还向retain计数添加1。自动释放是为了平衡这一点
您详细介绍的第二种方法在功能上是等效的,但由于可用内存相对较少,因此在嵌入式设备上被认为是一种更好的做法。创建对象,将其指定给特性,然后立即释放原始临时对象。在前一种方法中,对象被放置到自动释放池中,并在稍后的时间点释放。我认为您应该使用自动释放作为代码的最佳实践 您必须始终平衡内存管理等式,否则可能会导致内存泄漏 在您的示例中,它取决于xyz内存管理策略 如果xyz有保留策略,则保留计数为2。这是一个常见的错误,你有一个内存泄漏
@property (retain, nonatomic) SomeClass* xyz;
如果xyz具有分配策略,则不增加保留计数
@property (assign, nonatomic) SomeClass* xyz;
总之,如果使用retain策略,那么提供的第二个代码段就是正确的方法。显然,您必须记住在dealloc方法中释放该属性
- (void)dealloc
{
[xyz release];
[super dealloc];
}
希望有帮助。第二种方法最好将retain count保持为1。代码只分配内存,不释放内存,但不初始化对象,因此更糟。这正是我的观点。所以我说它会导致内存泄漏。你读过吗?我没有处理初始化问题。稍后初始化有什么问题吗?第二种方法最好是将retain count保持为1。可能的重复只是想给它添加一些香料,所以让我们用某种方法说,如果我将retain count清除为self.xyz=nil;在dealloc中,我只将其指定为[xyz release];确保始终调用该方法。可能的重复也有重复:还有更多。还有一个:它不是等价的。自动释放有更多的开销(当您自动释放时,将其放在自动释放池中;当您排空自动释放池时,它必须执行一个额外的操作)我说的功能等效,这意味着结果是相同的。你会注意到,在下一句话中,我解释说,最好在嵌入式设备上严格控制内存。无论如何,这都会被ARC否定。但是,当您有赋值时,保留计数为1也是一个错误policy@newacct啊,好的,我明白了。我的意思是,保留计数是1,因为它已经用alloc init分配了对象。使用“指定特性”将对象指定给特性无效。我的答案不清楚吗?@newacct我修改了我的答案。你认为这更清楚吗?谢谢。没关系,你以前说的比现在更正确(它确实有保留计数1)。只是它与使用assign属性的点不兼容