我可以在Objective-C 2.0中自动释放后释放一个对象

时间:2013-05-24 01:42:23

标签: objective-c

我的开发环境:

  

Xcode 4.6.2

     

非自动参考计数

例如,假设我们有一个名为CertainViewController.m的视图控制器,其中声明了一个名为certainProperty的属性,其属性为retainnonatomic

// CertainViewController.h
@interface CertainViewController : UIViewController
{
}
@property (retain, nonatomic) certainPropertyClass *listData;

// CertainViewController.m
- (void) viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    self.certainProperty = [[[certainPropertyClass alloc] init] autorelease];
    // Among other initialization...
}

dealloc方法中,当我们为属性release分配新值时,隐式certainProperty。不确定这是否有潜在危险。

// CertainViewController.m
- (void) dealloc
{
    self.certainProperty = nil;
}

请分享一些见解,谢谢:D

4 个答案:

答案 0 :(得分:3)

首先,您的代码是错误的

// CertainViewController.m
- (void) viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    //[[[self.certainProperty alloc] init] autorelease]; // this is a nop if self.certainProperty is nil or crash if not nil
    self.certainProperty = [[[YourPropertyClass alloc] init] autorelease];
    // Among other initialization...
}


// CertainViewController.m
- (void) dealloc
{
    self.certainProperty = nil;
    [super dealloc]; // you must call super
}

其次,假设certainProperty是保留属性,为其分配值将由setter调用retain

这样做

self.certainProperty = nil;
dealloc中的

需要平衡保留计数,否则certainProperty将被泄露。

答案 1 :(得分:1)

在非ARC环境中使用autorelease发布变量并非严格危险。但是,将autorelease标记为可以轻松手动释放的变量并不是一种很好的做法。 autorelease真正意味着当你想要在系统不再需要时尽快摆脱它时,通常在你不知道的时候使用它。因此,虽然您的代码并非严格无效,但只要知道在您确切知道何时释放对象时,最好手动调用release,例如在-dealloc方法中。

答案 2 :(得分:1)

如果你把它放在自动释放池中,那么你应该让autorelease处理它。就个人而言,我会自己处理对象的释放,除非它需要一个自动释放池(比如一些GUI对象引用)。但是将其设置为nil不是问题。您可以在nil对象上整天执行操作,没有任何副作用。

答案 3 :(得分:1)

坚持惯例。不要违反通常的记忆模型,除非有一些非常重要的事情,否则无法做到。

release将保留计数减少1.因此,为此调用release是不安全的。另一个对象可能保留了这个,因此保留计数为1.因此调用release可能会导致它被释放。 一般情况。

如果您有retain属性,那么为其分配对象将导致保留该对象。

self.retainProperty = [[[MyObject alloc] init] autorelease] 会导致retainCount = 1。

注意:certainProperty中初始化viewDidLoad:的方式是错误的。 alloc是一个类方法,它实际上返回一个新的已分配对象。所以[[[self.certainProperty alloc] init] autorelease];不会设置你的财产。正如xlc在answer中所说的那样。