【问题标题】:iOS - Objects being released?iOS - 正在释放的对象?
【发布时间】:2011-10-15 07:52:36
【问题描述】:

我有以下代码:

Dummy *dummy = [[Dymmy alloc] initWithDictionary:dummyData];
DummyTableItem *dummyTableItem = [DummyTableItem itemWithDummy: dummy];
[_data addObject: dummyTableItem];

init函数如下:

+ (id) itemWithDummy: (Dummy *) dummy {
  DummyTableItem *item = [[[self alloc] init] autorelease];
  item.dummy = dummy;
  return item;
}

- (id) init {
  self = [super init];
  if( self ) {
    dummy = nil;
  }
  return self;
}

将 dummy 声明为(非原子,保留)

还有假人:

@synthesize name=_name;

- (id) initWithDictionary: (NSDictionary *) dictionary {
  self = [super init];

  if( self != nil ) {
    if( [dictionary objectForKey:@"name"] )
  _name = [dictionary objectForKey:@"name"];
  }

  return self;
}

名称再次声明为(非原子,保留)

当我稍后尝试访问 dummyTableItem.dummy.name 以将其设置为 UILabel 时,我收到“-[CFString isEqualToString:]: message sent to deallocated instance 0x5b37a10”

我对保留的对象做错了什么吗?我在这里想念什么?同样在代码的第一部分中,我应该在将 dummyTableItem 添加到 _data 后释放它(这是一个 NSMutableArray?)

【问题讨论】:

    标签: iphone ios release


    【解决方案1】:

    这应该可以解决 Dummy 的 @implementation 内部的问题:

    @synthesize name=_name;
    
    - (id) initWithDictionary: (NSDictionary *) dictionary {
      self = [super init];
      if (self) {
        _name = [[dictionary objectForKey:@"name"] retain]; //retain it :)
      }
      return self;
    }
    

    既然您将name 声明为retain,您应该拥有它(这就是为什么我在分配它时添加了retain)。 此外,您无需检查if( [dictionary objectForKey:@"name"] ),因为无论如何_name = [nil retain];nil :)

    【讨论】:

    • 你也可以使用name属性的setter:self.name = [dictionary objectForKey:@"name"];
    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多