【问题标题】:creating an object and setting a retaining property创建对象并设置保留属性
【发布时间】:2011-07-15 10:45:26
【问题描述】:

使用 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的Analyzer也不喜欢)


webView = [[UIWebView alloc] init];
[self.webView setDelegate:self];
self.webView.hidden = YES;

(这个是最短的,比第一个例子更明显。但是它绕过了setter,所以如果稍后实现setter的自定义实现,它在这种情况下将不起作用)


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

【问题讨论】:

    标签: objective-c memory-management properties retain


    【解决方案1】:

    最好的选择,IMO,是你不喜欢的那个,即使用自动释放:

     self.webView = [[[UIWebView alloc] init] autorelease];
    

    如果您不想并且想要单行初始化,唯一的选择是您的第三个:

     webView = [[UIWebView alloc] init];
    

    因为所有其他的都需要一个明确的行来做一个额外的发布。

    我不认为它很糟糕,尤其是当它属于 init 方法并且您不会在不使用该属性的情况下在其他地方重新分配它时,我自己会在我认为合理的情况下使用它。

    与保留属性真正有效的是方便的构造函数,例如:

    self.image = [UIImage imageWithContentsOfFile:xxxxxxx];
    

    所以,如果你真的发现你列出的选项都不适合你,你可以添加一个类别到 UIWebView 和一个方便的构造函数为你做自动释放工作:

    self.webView = [UIWebView webViewWith......];
    

    【讨论】:

    • 请记住,第三个选项不会释放webView 的先前值。这将是我在初始化程序中的首选选项,因为在初始化程序中不鼓励使用访问器,但在其他必须确保释放先前值的方法中则不然。
    • 同意,这就是为什么我写道:“特别是当它属于 init 方法时”......你的评论非常清楚我的意思,虽然我表达得不太好...... :-) 所以你留下了方便的构造函数选项... :-)
    • 我写评论的时候还没有看到你的编辑。我只想说清楚:)
    • 我说没有自动释放的唯一原因是因为我已经收集到你应该避免它,除非你需要它。那么我应该alloc/initinit方法中的所有属性吗?或者我应该根据需要alloc/init 他们(例如viewDidLoad)?
    • @Jonathan。自动释放,还是不自动释放,这是个问题。一些程序员喜欢尽可能避免它;其他人则认为在大多数情况下使用自动释放的开销是没有意义的。要跟进,请参阅this questionthis oneanother one
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 2019-10-13
    • 2012-11-25
    • 1970-01-01
    • 2015-10-03
    相关资源
    最近更新 更多