【问题标题】:when are objects released什么时候释放对象
【发布时间】:2011-08-12 17:15:48
【问题描述】:

如果我使用关键字 init、alloc、copy 或 move 创建对象,我相信我必须释放它。我可以使用不使用此关键字的代码创建对象,所以我想我不必释放它们对吗?所以以这段代码为例:

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self 
           action:@selector(aMethod:)
 forControlEvents:UIControlEventTouchDown];
[button setTitle:@"Hello" forState:UIControlStateNormal];
button.frame = CGRectMake(40.0, 200.0, 170.0, 40.0);
[self.view addSubview:button];

因为我没有在我的代码中使用任何这些关键字,所以我不应该释放它,对吗?那么该对象何时被释放?我对内存管理的东西有点困惑。

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    您在此处创建的唯一对象是 UIButton,并且您使用了 buttonWithType 类方法。这将返回您自动释放的对象,因此您不必释放它。

    请记住,如果您以后需要此按钮,则需要保留它并最终释放它。因为您将此按钮添加到视图中,所以在这种情况下,视图会保留一个副本,因此您无需再担心它。

    【讨论】:

    • 如果我保留它,一旦我需要稍后释放它,对吗? (以防我以后需要使用它)如果我保留它两次我需要释放它两次?我在学习objective-c时阅读了一个解释类似内容的教程......
    • 正确 - 一旦对象的保留计数达到零,对象的内存就会被释放。每次保留对象时,保留计数都会增加。每次释放对象时,保留计数都会增加。自动释放的对象只是系统将在以后自动释放的对象。如果你没有在某处保留它,它的保留计数将为 1,因此系统一释放它就会被释放。
    【解决方案2】:

    如果您正在运行 XCode 4,我建议您运行“分析”模式以运行快速基本检查内存泄漏...看起来不错(您的代码)。

    【讨论】:

      【解决方案3】:

      您是绝对正确的,因为您不必通过分配、复制、新建或保留显式释放您不拥有所有权的任何内容。

      在本例中,您已通过便捷方法 (buttonWithType:) 创建了按钮。这将返回一个自动释放的 UIButton 对象。这会在运行循环结束时刷新自动释放池时自动释放。

      这里没有什么让你担心的。让运行时处理它。

      【讨论】:

        【解决方案4】:

        有一个NSAutoreleasePool 为您管理内存。你对 alloc 和 copy 是正确的(alloc 和 init 通常是一起的),但没有移动。另一种返回保留对象的方法是以new ex 为前缀的方法。 +(id)new;。每个线程都需要一个自动释放池来管理每个事件循环的内存。

        按钮实现的外观示例

        -(id)buttonWithType:(UIButtonType)type
        {
            UIButton *button = [[[UIButton alloc] initSecretlyWithType:type] autorelease]; 
            //Customize button if needed
            return button;
        }
        

        更多详情请见Using Autorelease Pools

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多