Objective c 查找EXC\u坏访问的原因
我有一个具有以下init方法的类:Objective c 查找EXC\u坏访问的原因,objective-c,exc-bad-access,Objective C,Exc Bad Access,我有一个具有以下init方法的类: - (id)init { self = [super init]; if (self) { // Initialization code here. StateStack* s = [[StateStack alloc] init]; state = s; [s push:NONE]; //<--EXC_BAD_ACCESS on load here [s r
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
StateStack* s = [[StateStack alloc] init];
state = s;
[s push:NONE]; //<--EXC_BAD_ACCESS on load here
[s release];
}
return self;
}
奇怪的是,如果我删除NSLog行,EXC_BAD_访问将移动到StateStack的dealloc方法:
- (void)dealloc {
[stack release]; //<--EXC_BAD_ACCESS
[super dealloc];
}
-(无效)解除锁定{
[堆栈释放]//
状态堆栈
}
state=s
没有复制NSMutableArray对象,只是复制指向它的指针。因此,当您调用[s release]
时,由s和state引用的对象被释放。从那时起,无论何时使用,您都将获得EXC\u BAD\u访问权限
另外,不要使用[object retainCount]
调试内存管理问题。这是谎言。Google NSZombies。在您的init
函数中:
StateStack* s = [[StateStack alloc] init];
state = s;
[s push:NONE]; //<--EXC_BAD_ACCESS on load here
[s release];
注:我不想引起误解。使用retain count检查内存分配是否正确是没有用的。这是真的。无论如何,根据保留计数进行推理有助于理解在分配/释放/自动释放对象时会发生什么。它是基本的机制,但是要跟踪它的使用情况以检查内存管理的正确性太困难了
- (id)init{
self = [super init];
if (self) {
// Initialization code here.
state = [[StateStack alloc] init];
[state push:NONE];
}
return self;
}
- (id)init {
self = [super init];
if (self) {
stack = [[NSMutableArray alloc] init];
}
return self;
StateStack* s = [[StateStack alloc] init];
state = s;
[s push:NONE]; //<--EXC_BAD_ACCESS on load here
[s release];
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
StateStack* s = [[StateStack alloc] init];
state = s;
[s push:NONE]; //<--EXC_BAD_ACCESS on load here
}
return self;
}
- (id)init {
self = [super init];
if (self) {
NSMutableArray* s = [[NSMutableArray alloc] init];
stack = s;
}
return self;
}