确定。我有一个非常奇怪和令人难以置信的问题。我有两个类文件,它们都是NSObject继承者。该系列代码如下
CustomClass * obj;
obj = [[CustomClass alloc] init];
[myArray addObject:obj]; < --------在此行之后,如果我将鼠标悬停在数组上,则会将其显示为有1个超出范围的对象。
如果我将鼠标悬停在两个对象上,它们都会看起来像是初始化的内存位置,所以我真的不知道这里发生了什么。提前谢谢。
UPDATE :代码中有一个地方,我用计时器重复调用一个函数。在计时器内部,我执行以下操作。
CustomClass * obj = [CustomClass alloc];
obj = [myArray objectAtIndex:0];
obj.var + = 10;
[obj release];
在obj.var行上,我收到一个EXC_BAD_ACCESS错误。考虑到它被反复调用,我可能正在做错误的分配和释放,但我已经尝试了我能想到的一切。
答案 0 :(得分:1)
我认为您指的是XCode调试功能,它向您显示变量的内容。
我确实遇到了同样的问题,而且我确信这通常不会对你的代码造成问题。
现在我不确定这是为什么会发生这种情况,但我相信你的例子中的变量obj不再用于调用之后。这意味着编译器重用了存储此引用的位置,因此调试器可能“丢失”指向您的变量的指针,它将显示为超出范围(但我不是gcc或调试器方式的专家,所以我这可能是错的。)
答案 1 :(得分:0)
此代码错误:
CustomClass *obj = [CustomClass alloc];
obj = [myArray objectAtIndex:0];
obj.var += 10; [obj release];
你正在做的是分配一个新的CustomClass(没有初始化它,永远不应该这样做),然后用数组中的对象替换它(泄漏旧的),然后从数组中释放对象。这将在下次访问数组中的对象时导致崩溃。相反,只需说:
CustomClass *obj = [myArray objectAtIndex:0];
obj.var += 10;
除非release
提前,否则不要retain
。 (有关更多信息,请参阅Cocoa memory management guide)。
答案 2 :(得分:0)
这不是您所指的问题,但请不要这样做:
CustomClass *obj = [CustomClass alloc];
永远不要在没有某种init的情况下发出alloc。此外,在您发布的代码的上下文中,不需要,因为您在下一行为obj分配值。
然后[obj release];
不是必需的,因为您没有保留从myArray
获得的obj值。你可能正在这样做是因为前面的alloc
,正如我所说的那样,这不是必需的。
如果对obj.var
的引用导致BAD_ACCESS,那么obj
或var
已被其他地方的代码dealloc
编辑,几乎可以肯定var
。