当我以这种方式设置attribut时是否存在内存泄漏:
titleView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)];
与
存在差异UIWebView *newWebView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)];
[self setTitleView:newWebView];
[newWebView release];
谢谢,
编辑: 我正在发布dalloc函数中的titleView
答案 0 :(得分:1)
假设您有一个名为titleView的属性。
@property(保留)titleView
第一个泄漏,除非你在 dealloc 上发布它(但要注意你是否多次分配它)
正确的应该是:
self.titleView = [[[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)] autorelease];
最好使用self.propertyName,因为它也会释放旧值。
答案 1 :(得分:0)
如果titleView
在没有保留属性的情况下被拒绝,则存在差异。
在第一种情况下,一切都会好的。在第二个中 - 您无法在titleView
之后使用[newWebView release]
。
答案 2 :(得分:0)
假设你已正确宣布了这个项目:
@property (nonatomic, retain) UIWebView *titleView;
如果:
self.titleView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)];
然后你会泄漏,但当你这样做的时候,就像伊利沙那样:
titleView = [[UIWebView alloc] initWithFrame:CGRectMake(10, 0, 300, 5)];
你没事。
但你需要在dealloc中发布它:
- (void)dealloc {
[titleView release], titleView = nil;
[super dealloc];
}
答案 3 :(得分:0)
不要将属性与实例和/或局部变量混淆。通过self
访问属性(或属性),而实例变量直接由其名称访问。
在第一个例子中有一个泄漏,因为我看不到发送给titleView
的发布消息。如果titleView
是实例变量,您可以使用viewDidUnload
方法释放它。如果它是本地的 - 你应该在添加到某个视图时释放它(如第二个例子中所示)。
在第二个例子中没有内存泄漏。