创建对象并设置保留属性

时间:2011-07-15 10:45:26

标签: objective-c memory-management properties retain

使用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的自定义实现,它将无法在这种情况下工作)


那么应该使用哪个例子,还是有更好的方法?

1 个答案:

答案 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......];
相关问题