最近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
中发布它?
答案 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指向的对象。