在另一个函数中调用NSMutableSet的方法会抛出EXC_BAD_ACCESS

时间:2011-06-15 12:59:00

标签: memory-management exc-bad-access nsmutableset

我坚持使用这样的代码:

static NSMutableSet* test_set;

-(void)foo1
{
  test_set=[NSMutableSet setWithObject:[NSNumber numberWithInt:1]];
  NSLog(@"count:%d",[test_set count]);
}


-(void)foo2
{
  NSLog(@"pointer:%p",test_set);
  NSLog(@"count:%d",[test_set count]); // here I get EXC_BAD_ACCESS
}

我只在foo1之后调用foo2。 我的调试就像:

count:1
pointer:0x262790
Program received signal:  “EXC_BAD_ACCESS”.

怎么了? __ 有趣的说明:只有当foo2在时间表中调用时它才会失败.__对不起,我错过了细节。两者都很完美。谢谢大家

2 个答案:

答案 0 :(得分:0)

您没有获得分配给test_set的对象的所有权,这意味着可能会在-foo2发送之前取消分配。一般来说,如果您需要一个对象在执行方法后生存,那么您应该拥有它 - 例如,通过+alloc-retain

-(void)foo1
{
  test_set=[[NSMutableSet alloc] initWithObjects:[NSNumber numberWithInt:1], nil];
  NSLog(@"count:%d",[test_set count]);
}

-(void)foo1
{
  test_set=[[NSMutableSet setWithObject:[NSNumber numberWithInt:1]] retain];
  NSLog(@"count:%d",[test_set count]);
}

Memory Management Programming Guide中讨论了取得和放弃对象所有权的规则。

答案 1 :(得分:0)

您尚未保留test_set。 setWithObject:返回的集合将自动释放。如果你添加

[test_set retain];

setWithObject: foo1()获取后退,然后添加

[test_set release];

foo2()的末尾,它应该有效。

你应该阅读Cocoa Memory Management Programming Guide