【问题标题】:Autorelease causing app crash自动释放导致应用程序崩溃
【发布时间】:2011-12-31 23:08:21
【问题描述】:

我已经在这个问题上旋转了 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]; [滚动视图发布];

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

UIView *containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 0)] autorelease]; ...(定义东西) // 设置它 [containerView addSubview:imageView]; [containerView addSubview:textLabel]; [containerView addSubview:detailTextLabel]; [containerView addSubview:addButton]; [容器视图添加子视图:小时]; // 然后忘记它 [imageView 发布]; [文本标签发布]; [detailTextLabel 发布]; [添加按钮释放]; [小时释放]; 返回容器视图;

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

谢谢

【问题讨论】:

  • 代码看起来正确。您是否打开了 NSZombieEnabled 标志以查看是否确实如此?
  • 您发布的 sn-p 在内存管理方面是正确的。您如何初始化添加到 containerView 的对象?尝试运行静态分析器,看看它是否捕捉到任何东西。
  • 使用 return [containerView autorelease];并从 UIView 初始化中移除 autorelease。

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


【解决方案1】:

使片段如下所示

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 并在我将它作为滚动视图的子视图后释放它。所以不会有任何内存泄漏。

【讨论】:

  • 嗨,gomathi,这是阿伦,你来自哪里,你在哪里工作,这是阿伦在钦奈工作,ios dev
  • 另外,检查一件事。您正在generateContactsRow 方法中释放addButton。请检查您是否正在分配对象。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多