【问题标题】:Proper way to release an instance variable in dealloc, Objective C在dealloc,Objective C中释放实例变量的正确方法
【发布时间】:2014-03-28 11:30:32
【问题描述】:

我一直想知道在类的dealloc 方法中释放实例变量的正确方法。假设我有一个名为 myString 的实例变量,

// MyClass.h
{
NSString *myString;
}
@property(nonatomic,retain) NSString *myString;

// MyClass.m
@synthesize myString;

-(void)dealloc
{
[self setMyString: nil]; 
[super dealloc];
}

Apple 文档指出Don’t Use Accessor Methods in Initializer Methods and dealloc。我发现一些输入将实例变量设置为 nil 可以完成释放实例变量的工作(我在上面的 dealloc 方法中所做的)。那么,如果这是释放实例变量的正确方法,那么为什么 Apple 说不建议在 dealloc 方法中使用访问器呢?

【问题讨论】:

  • 正确的方法,恕我直言,使用ARC

标签: objective-c cocoa instance-variables accessor dealloc


【解决方案1】:

你应该在对象上调用 release;

-(void)dealloc {
   [myString release], myString = nil;
   [super dealloc];
}

这与多线程有关,可能还有其他线程也在访问该属性。

但你应该更多地添加ARC,然后你不必将dealloc添加到你的任何对象中,编译器会为你的艺术编译时间添加保留/释放消息。

Apple 发布了一个不错的Transitioning to ARC Release Notes

【讨论】:

  • 你写的和[self setMyString: nil];有什么区别?我没有看到任何
  • 他也用过[xyz release]
  • @AndreyChernukha:您正在调用 setter 方法。在dealloc 中,与键值编码有关,这样做存在一些问题。
  • 使用 ARC,您仍然可以实现一个 dealloc 方法来进行其他清理,尽管简单地将 ivar 分配给 nil 是不必要的。对于 ARC,您不应包含 [super dealloc]
猜你喜欢
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2010-11-02
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多