为什么别名新名称并明确释放IBOutlet属性?

时间:2011-05-05 07:04:33

标签: objective-c properties

最近Apple的一些例子看起来像这样:

@interface ViewController : UIViewController
{
  **// Notice no more ivar here.**
}

@property (nonatomic, retain) IBOutlet UIWebView *webView;

@end

@implementation ViewController
@synthesize webView = _webView;

...

- (void)dealloc
{
  [_webView release];

  [super dealloc];
}

我的问题是为什么将webView别名化为_webView,然后在dealloc中发布,因为没有名为_webView的ivar?

还有一个问题,如果我声明一个没有相关ivar的属性,我是否需要在dealloc中发布它?

2 个答案:

答案 0 :(得分:1)

我认为Use of properties by Xcode 4 templates会比我更好,更详细地解释这一点。

答案 1 :(得分:1)

当您@synthesize某个没有关联的ivar的属性(无论您说@synthesize property还是@synthesize property=_property)时,会为您生成一个ivar。默认情况下,ivar使用与属性本身相同的名称。如果属性是retain属性,那么您必须release -dealloc中的对象,否则您将发生内存泄漏。

Apple的惯例是命名ivars(无论是在界面中明确声明还是隐含在@synthesize中),并使用下划线表示ivar的私有性质。 IMO它也有助于确保人们只在他们打算使用时才使用ivar(因为对于某些程序员而言,当你的意思myproperty时,似乎很容易意外地键入self.myproperty,这可能会造成重大错误)。

你上一个问题的答案基本上是肯定的,但从技术上讲,答案是“有时”。如果存储在保留的ivar中的对象,则只需释放该对象。那是大部分时间。但是,属性只是调用名为“myproperty”和“setMyproperty”(等)的方法的快捷方式,因此可以使用一对具有这些名称的方法以及实际上没有与之配对的ivar的关联属性。但是,如果您使用retain属性声明属性并对其进行合成,则应始终释放其ivars指向的对象。