Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 查找EXC\u坏访问的原因_Objective C_Exc Bad Access - Fatal编程技术网

Objective c 查找EXC\u坏访问的原因

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

我有一个具有以下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 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;
 }