Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用分配保留自我对象是否好_Ios_Objective C_Memory Management_Autorelease - Fatal编程技术网

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属性的点不兼容