保留自我对象与分配是否好主意

时间:2012-01-10 18:51:52

标签: 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的最佳方法是什么。

感谢。只是试图清除一些内存管理概念清楚一点。

7 个答案:

答案 0 :(得分:3)

这取决于您处理财产xyz的方式。如果你做了

@property (nonatomic, retain) NSObject *xyz;

然后xyzNSDictionary上有一个保留,所以第二个(3行)版本最好。

答案 1 :(得分:2)

我通常会这样做:

self.xyz = [[[NSDictionary alloc] init] autorelease];

或者如果班级有方便的方法,那么就这样使用它:

self.xyz = [NSDictionary dictionary];

或者,在这种情况下,只需使用ARC并让它为您完成工作。

答案 2 :(得分:2)

我假设我们在谈论不使用ARC时的最佳做法。

在手动内存管理环境中,第一种方法是错误的,因为正如您所指出的,保留计数为2.执行单行的正确方法是这样的:

self.xyz = [[[NSDictionary alloc] init] autorelease];

通过合成的setter(假设使用retain指令声明xyz),除了由alloc / init添加的1之外,还为保留计数加1。自动释放是为了平衡这一点。

您详述的第二种方法在功能上是等效的,但由于可用内存相对较少,因此在嵌入式设备上被认为是更好的做法。您创建一个对象,将其分配给属性并立即释放原始临时对象。在前一种方法中,对象被放入自动释放池中,并在稍后的时间点释放。

答案 3 :(得分:1)

我认为你应该使用autorelease作为代码的最佳实践。

答案 4 :(得分:0)

你总是要平衡内存管理方程,如果没有,你可能会有内存泄漏。

在您的示例中,它取决于xyz内存管理策略。

如果xyz有保留策略,则保留计数为2。这是一个常见的错误,你有内存泄漏。

@property (retain, nonatomic) SomeClass* xyz;

如果xyz具有分配策略,则不会增加保留计数

@property (assign, nonatomic) SomeClass* xyz;

总之,如果您使用保留政策,您提供的第二个代码段是正确的方式。显然你必须记得在dealloc方法中释放该属性。

- (void)dealloc
{
   [xyz release];     
   [super dealloc];
}

希望它有所帮助。

答案 5 :(得分:0)

第二种方法是将保留计数保持为1的最佳方法。

答案 6 :(得分:-6)

以我的拙见,

self.xyz = [NSDictionary alloc]

会导致内存泄漏。您需要手动发布。

你可以这样做

xyz = [NSDictionary alloc]

之后,即使我有同样的问题。哪种方法更好?为什么?