我是Objective-C的新手,虽然我读过一些内存管理文章,但是遇到了麻烦。
我上课是这样的:
-(UIWebView*)getWebView{
//UIWebView* webview = [UIWebView initWithFrame:self.frame]; edited,the original wrong line
UIWebView* webview = [[UIWebView alloc] initWithFrame:self.frame];
return webview;
}
-(void)addToSelf{
UIWebView* view = [self getWebView];
[self addSubview:view];
[view release]; //release here
}
在我看来,objc对象都像C指针(是?)
然后这样想:
UIWebView* webview = [[UIWebView alloc] initWithFrame:self.frame]; //retain +1
UIWebView* view = [self getWebView]; //just a pointer to the same object ?
[self addSubview:view]; //retain +1
[view release]; //retain -1
现在查看的
retainCount = 1
。然后,此viewController将处理Webview的生命周期。
我的想法一定有问题(还请确保代码),
,但我不知道为什么。
UIWebView* webview = [[[UIWebView alloc] initWithFrame:self.frame] autorelease];
当我删除最后一个发布行时,代码可以正常工作,为什么?
有什么区别?
--------------编辑行-------------------
几分钟前,有一个答案,但它消失了,现在我重写了自己的想法:
答案说:
当从method返回对象时,我必须使用 autorelease 告诉编译器我已经结束了,然后使用addSubview结束(不需要释放)。
我知道这是对的,但为什么会这样呢?
在大多数代码中:
-(void)someMethod{
UIWebView* webview = [[UIWebView alloc] initWithFrame:self.frame];
[self addSubview:webview];
[webview release];
}
这可以正常工作,但是当将代码分离到两个方法(例如top)时,不是这样。
为什么返回对象时必须使用 autorelease ?
最佳答案
似乎您没有分配UIWebView:
UIWebView* webview = [[UIWebView alloc] initWithFrame:self.frame];
这意味着您可能没有有效的UIWebView和未定义的保留计数,因为UIWebView的代码实际上正在使用一些未知的内存。如果这有效,那么您很幸运。