我的开发环境:
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
方法中,当我们为属性release
分配新值时,隐式certainProperty
。不确定这是否有潜在危险。
// CertainViewController.m
- (void) dealloc
{
self.certainProperty = nil;
}
请分享一些见解,谢谢:D
答案 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中所说的那样。