【问题标题】:Objective C autoreleaseObjective C 自动释放
【发布时间】:2011-02-05 14:59:31
【问题描述】:

你好,我不完全理解 obj-C 中的 autorelease 函数调用。

@interface A{
id obj;
}

@implementation A

-(void)myMethod;
{
obj = [BaseObj newObj];           //where newObj is a method like :[[[BaseObj alloc]init]autorelease];
}

-(void)anotherMehtod;
{
[obj someMeth];                     //this sometimes gives me EXC_BAD_ACCESS
}

@end

所以为了解决这个问题,我设置了一个保留。现在如果我保留它,我需要手动释放它吗?

【问题讨论】:

  • 附注:Cocoa 中的规则是,如果方法名称以newcopyretainalloc 开头,调用者必须发送release 或@ 987654327@ 来平衡它。所以名为newObj 的方法不应该自动释放自己的结果。

标签: objective-c autorelease


【解决方案1】:

如果您是对象的所有者 - 您有责任释放它。

如果您至少完成了以下一项操作,您将成为对象的所有者:

  • 通过alloc实例化它
  • 通过retain
  • 通过copy

更多详情请阅读Object Ownership and Disposal

【讨论】:

  • 你忘记了new,所以如果+newObj 遵循指导方针,那么该对象甚至不应该首先被自动释放。
  • @Georg Fritzsche:new[[aClass alloc] init]; 相同。因此,仅提及alloc 就够了。描述中的+newObj 已经包含推迟的release 通过:alloc]init]autorelease],所以这里不需要额外的release
  • 当然obj 已经在anotherMehtod 发布了,这就是为什么EXC_BAD_ACCESS 结果
【解决方案2】:

是的。规则是,如果你保留一个对象,你也有责任在 iOS 中释放它。

【讨论】:

    【解决方案3】:

    与 Obj-C 中的所有其他静态方法一样,[BaseObj newObj] 仅存在于您的方法 -(void)myMethod 在此方法的末尾(大致)obj 从自动释放池中获取 -release 消息。

    如果您想保留此对象 - 使用 [[BaseObj newObj] retain][BaseObj alloc] init] 并在 -dealloc 或必须时释放它。

    例如:

    @interface A{
      id obj;
    }
    
    @implementation A
    
    -(void)myMethod
    {
      [obj autorelease];
      obj = [[BaseObj newObj] retain];           //where newObj is a method like :[[[BaseObj alloc]init]autorelease];
    }
    
    -(void)anotherMehtod;
    {
      [obj someMeth];                     //this sometimes gives me EXC_BAD_ACCESS
    }
    
    -(void)dealloc
    {
      [obj release];
      [super dealloc];
    }
    
    @end
    

    【讨论】:

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