繁体   English   中英

iOS-对象被释放?

[英]iOS - Objects being released?

我有以下代码:

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

初始化函数如下:

+ (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;
}

假人声明为(非原子,保留)

和虚拟:

@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吗?

这应该可以解决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]; if( [dictionary objectForKey:@"name"] ) _name = [nil retain]; 反正是nil :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM