保留自我对象和分配是个好主意吗



我正在作为进行一些分配

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

保留这样的房产是个好主意吗?或

这样做会更好吗:

NSDictionary *zzz = [[NSDictionary alloc] init];
self.xyz = zzz;
[zzz release];

我在这里担心的是,我看到了一些人保留的地方,比如:

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

这意味着保留计数为2。那么,将这里的计数减少到1的最佳方法是什么呢。

谢谢。只是想把一些内存管理的概念再清楚一点。

这取决于您如何处理属性xyz。如果你做了

@property (nonatomic, retain) NSObject *xyz;

xyzNSDictionary上具有保留,因此第二(3行)版本是最好的。

我通常会这样做:

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

或者,如果类有一个方便的方法,那么就这样使用它:

self.xyz = [NSDictionary dictionary];

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

我假设我们谈论的是不使用ARC时的最佳实践。

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

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

通过合成的setter(假设xyz是用retain指令声明的),除了alloc/init加上的1之外,还会在retain计数上加1。自动释放酶是用来平衡这一点的。

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

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

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

您必须始终平衡内存管理等式,否则可能会出现内存泄漏。

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

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

@property (retain, nonatomic) SomeClass* xyz;

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

@property (assign, nonatomic) SomeClass* xyz;

总之,如果您使用保留策略,那么您提供的第二个片段是正确的方法。显然,您必须记住在dealloc方法中释放该属性。

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

希望能有所帮助。

在我看来,

self.xyz = [NSDictionary alloc]

将导致内存泄漏。您需要手动释放。

你可以做这个

xyz = [NSDictionary alloc]

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

最新更新