2011-02-04 68 views
2

为什么我会用(在我的dealloc方法中)?为什么myInstance = nil而不是self.myInstance = nil?

  1. [myInstance release]代替[self.myInstance release]
  2. myInstance = nil而不是self.myInstance = nil

虽然我们使用self.myInstance = [[[AClass alloc] init] autorelease]代替myInstance = [[[AClass alloc] init] autorelease]

这些做法来自我在网上看到的众多例子。

+0

请搜索该网站。这个问题以前已经出现过很多次了。 – 2011-02-04 07:59:01

回答

1

1)将myInstance发布]而不是[self.myInstance发布]

更喜欢前者。

self.myInstance的返回值由子类已重写方法myInstance的实现定义。你对dealloc期间构造对象的接口行为不感兴趣(因为子类可能会覆盖并返回除你的ivar以外的东西)。

你对dealloc感兴趣的是在你的对象被销毁之前释放你拥有的引用。如果子类已覆盖myInstance,那么它可以:

一)返回伊娃(在子类中声明),这已经被释放

二)覆盖的实施可能会返回一个新创建自动释放对象

a或b可能导致过度释放和崩溃(假设其他所有内容都正确保留/释放)。这也说明了为什么你应该在释放伊利尔后将它分配给伊娃。

这也是如何触发对象复活的经典例子。当你调用的getter/setter的实现在它已经被释放后重新创建它的状态时,就会发生对象复活。最少的攻击性副作用会导致无害的泄漏。

2)将myInstance =零,而不是self.myInstance =零

再次,倾向于前者。

正式回复看起来很像对#1的回应 - 理由,副作用和危险也适用于此处。

来处理这个最安全的方式是直接访问伊娃:

[myInstance release], myInstance = nil; 

,因为有可能是得了很严重的副作用(崩溃,泄漏,复活),这可能是难以重现。

这些危险可能很容易避免,您的代码将更容易维护。另一方面,如果人们在使用你的程序时遇到了副作用,他们可能会避免(重新)使用它。

好运

1

调用self.myInstance =使用自动生成的setter方法。调用[self.myInstance release];调用getter方法返回的对象的释放。这一切都取决于你的财产如何建立(保留,分配?)。你的问题没有必然的正确或错误的答案,因为这一切都取决于有问题的财产。我建议你阅读Objective C properties以获得更好的感觉。

,除非将myInstance与分配宣布,你不会想打电话给self.myInstance = [[AClass alloc] init]你会用self.myInstance好得多= [[[AClass alloc] init] autorelease]

1

这取决于您在接口中定义的属性。例如,如果你定义保留产权:

@property (nonatomic, retain) NSObject *property; 

,那么你可以在dealloc方法只使用self.property = nil;,因为它等于:

[property release]; // releases previous property 
property = [nil retain]; // [nil retain] returns just nil 

同样的事情与self.property = [[A alloc] init];。这相当于

[property release]; // releases previous property 
property = [[[A alloc] init] retain]; 

如果是property = [[A alloc] init];属性将不会被保留。

Here's一个完整的属性指南形式苹果。

+0

致@kovpas,您的链接到期。这是一个:https://developer.apple.com/library/mac/documentation/cocoa/conceptual/codingguidelines/Articles/NamingIvarsAndTypes.html – Cong 2013-11-03 06:31:06

0

实际使用

self.myInstance = [[AClass alloc] init]; 

将在内存泄漏导致,原因self.myInstance使用setter方法,这导致在保持与+1的alloc沿/初始化保留1。所以你会得到一个保留计数+2;

0
... = self.myInstance 

self.myInstance = ... 

实际上是子程序或方法调用getter和setter方法,这取决于你如何定义这些子程序,或有Objective C的属性创建它们,几乎可以为所欲为。

如果保留属性的情况下,子例程可能会使用保留计数。如果你做自己的getter和setter,你可以让他们控制你房子里的灯光,把它们打开为零,并将零点或零点设置为零时熄灭灯光。这里甚至不需要被命名为 “实例” 的背变量,它可以通过设置:

instance = ... 
1

注意使用

myInstance = nil 

代替

self.myInstance = nil 

那是不正确的(中说,在一个UIViewController子类viewDidUnload方法的情况下),如果将myInstance是保留属性,因为如果myInstance指向一个对象,它将被泄漏!