关于C#:为什么别名新名称并明确释放IBOutlet属性?

Why alias a new name and explicitly release the IBOutlet property?

最近,苹果公司的一些例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@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中释放它吗?


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

苹果的惯例是命名ivar(无论是在接口中显式声明还是在@synthesize中隐式声明),并在其下加一个底线,以表明ivar的私有性质。在我看来,确保人们只在打算使用ivar的时候才使用ivar也是很有帮助的(因为对于某些编码人员来说,当你指的是self.myproperty,它很容易意外地键入myproperty,这可能会造成严重的错误)。

你最后一个问题的答案基本上是肯定的,尽管从技术上讲,答案是"有时"。只有在IVAR中存储了一个被保留的对象时,才需要释放该对象。大部分时间都是这样。但是,属性只是调用名为"MyProperty"和"SetMyProperty"等方法的快捷方式,因此可能有一对具有这些名称的方法和一个实际上没有与之配对的IVAR的关联属性。但是,如果要用retain属性声明属性并合成它们,则应该始终释放它们的ivar指向的对象。


我认为xcode 4模板对属性的使用将比我能更好更详细地解释这一点。