我坚持使用这样的代码:
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在时间表中调用时它才会失败.__对不起,我错过了细节。两者都很完美。谢谢大家
答案 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。