我是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的代码实际上正在使用一些未知的内存。如果这有效,那么您很幸运。

10-08 06:12
查看更多