如何解决在其他函数中调用NSMutableSet的方法将引发EXC_BAD_ACCESS
| 我被卡在这样的代码上: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在schedule中调用时,它才会失败。__对不起,我错过了细节。两者都完美。谢谢你们
解决方法
您不拥有分配给
test_set
的对象的所有权,这意味着在发送ѭ3deal之前可能已将其释放。通常,如果您需要一个对象在执行方法后得以生存,那么您应该拥有它的所有权,例如通过+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]);
}
《内存管理编程指南》中讨论了获取和放弃对象所有权的规则。
, 您尚未保留test_set。 setWithObject:
返回的设定将被自动释放。如果添加
[test_set retain];
从foo1()
中的setWithObject:
取回布袋后,加上
[test_set release];
到foo2()
的末尾,它应该可以工作。
您可能应该阅读《 Cocoa内存管理编程指南》。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。