使用alloc和init创建对象时,如何设置保留属性? (不使用自动释放)
在标题中使用此行(以及实现中相应的@synthesize行):
@property(retain)UIWebView *webView;
这是我拥有的三个选项(我认为):
UIWebView *tempWebView = [[UIWebView alloc] init];
[tempWebView setDelegate:self];
tempWebView.hidden = YES;
self.webView = tempWebView;
[tempWebView release];
(这个关于内存管理似乎最好,但是代码行更多,并且涉及一个愚蠢的变量名,因此可读性会降低)
self.webView = [[UIWebView alloc] init];
[self.webView release];
[self.webView setDelegate:self];
self.webView.hidden = YES;
(这个更明显发生了什么,但内存管理似乎不太好,Xcode的分析师也不喜欢它)
webView = [[UIWebView alloc] init];
[self.webView setDelegate:self];
self.webView.hidden = YES;
(这个是最短的,它比第一个例子更明显。但是它绕过了setter,所以如果稍后实现setter的自定义实现,它将无法在这种情况下工作)
那么应该使用哪个例子,还是有更好的方法?
答案 0 :(得分:1)
最好的选择,IMO,是你不喜欢的选择,即使用autorelease:
self.webView = [[[UIWebView alloc] init] autorelease];
如果您不想并希望进行单行初始化,唯一的选择是您的第三个:
webView = [[UIWebView alloc] init];
因为所有其他人都需要一个明确的行来进行额外的释放。
我不认为它很糟糕,特别是当它属于init
方法并且你没有使用该属性时你不在其他地方重新分配它,而我自己在它看起来合理时使用它。< / p>
保留属性的效果非常好,例如:
等便利构造函数self.image = [UIImage imageWithContentsOfFile:xxxxxxx];
所以,如果你真的发现你列出的所有选项都不适合你,你可以为UIWebView
添加一个类别,并为你做一个自动释放工作的便利构造函数:
self.webView = [UIWebView webViewWith......];