0

我的开发环境:

Xcode 4.6.2

非自动引用计数

例如,假设我们有一个名为 的视图控制器CertainViewController.m,其中一个属性被调用certainProperty并被retain声明nonatomic

// 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,存在隐含的含义。不确定这是否有潜在危险。releasecertainProperty

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

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

4

4 回答 4

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是一个保留属性,给它赋值将由retainsetter调用。

这样做

self.certainProperty = nil;

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

于 2013-05-24T02:01:32.867 回答
1

autorelease在非 ARC 环境中释放变量并不是绝对危险的。但是,仅标记autorelease您可以轻松手动释放的变量并不是很好的做法。autorelease当您想在系统不再需要对象时立即删除它时,通常会使用它,通常是在您不知道的时候。因此,尽管您的代码并非严格无效,但您只需知道最好release在您确切知道何时释放对象时手动调用,例如在您的-dealloc方法中。

于 2013-05-24T01:53:40.983 回答
1

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

于 2013-05-24T01:55:11.963 回答
1

遵守约定。不要违抗通常的记忆模型,除非有一些非常重要的事情不能以其他方式完成。

release将保留计数减少 1。因此调用它是不安全的release。另一个对象可能已保留它,因此保留计数为 1。因此调用release可能会导致它被释放。大体上是这样。

如果您有一个retain属性,那么将一个对象分配给它将导致保留该对象。

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

注意:您初始化的方式certainPropertyviewDidLoad:错误的。alloc是一个类方法,它实际上返回一个新分配的对象。所以[[[self.certainProperty alloc] init] autorelease];不会设置你的财产。按照 xlc 在他的回答中说的做。

于 2013-05-24T02:10:43.903 回答