自动释放导致应用程序崩溃

时间:2011-11-18 05:24:31

标签: iphone objective-c ios memory-management memory-leaks

我现在已经在这上面旋转了2个小时,所以我想在这里发布一些建议。

在我的viewDidLoad方法中,我这样做:

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 600)];
...
UIView *contactsRow = [self generateContactsRow];
contactsRow.frame = CGRectMake(10, tableMaxY, 300, 56);
...
[scrollView addSubview:contactsRow];
[self.view addSubview:scrollView];
[scrollView release]; 

在[self generateContactsRow]中,我基本上创建了一个容器视图,在里面加载了一堆其他视图(按钮,标签等),并将其返回。

UIView *containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 0)] autorelease];
... (define stuff)
// set it
[containerView addSubview:imageView];
[containerView addSubview:textLabel];
[containerView addSubview:detailTextLabel];
[containerView addSubview:addButton];
[containerView addSubview:hr];

// and forget it
[imageView release];
[textLabel release];
[detailTextLabel release];
[addButton release];
[hr release];

return containerView;

我自动释放containerView的事实导致我的应用程序崩溃。我返回一个alloc'd对象,所以我认为我必须以某种方式释放它,自动释放似乎是最好的方法。如果我删除它,一切正常,但我不会有内存泄漏吗?

由于

2 个答案:

答案 0 :(得分:2)

使细分如下

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 600)];
...
UIView *contactsRow = [[self generateContactsRow] retain];
contactsRow.frame = CGRectMake(10, tableMaxY, 300, 56);
...
[scrollView addSubview:contactsRow];
[self.view addSubview:scrollView];
[contactsRow release]; 
[scrollView release]; 

我在此处保留contactsRow并在将其作为scrollView的子视图后发布。所以不会有任何内存泄漏。

答案 1 :(得分:0)

您可以在viewdidunload或viewwillDisapper方法中释放它......