iOS - 正在发布的对象?

时间:2011-10-15 07:52:36

标签: iphone ios release

我有以下代码:

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:]:消息发送到解除分配的实例0x5b37a10”

我是否对保留的对象做了一些完全错误的事情?我在这里错过了什么?在代码的第一部分,我应该在将它添加到_data(这是一个NSMutableArray?)后释放dummyTableItem吗?

1 个答案:

答案 0 :(得分: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的原因)。 此外,您无需检查if( [dictionary objectForKey:@"name"] ),因为_name = [nil retain];仍为nil:)