Objective-C iPhone - NSMutableArray addobject立即超出范围

时间:2010-04-24 21:06:41

标签: iphone nsmutablearray scope

确定。我有一个非常奇怪和令人难以置信的问题。我有两个类文件,它们都是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错误。考虑到它被反复调用,我可能正在做错误的分配和释放,但我已经尝试了我能想到的一切。

3 个答案:

答案 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,那么objvar已被其他地方的代码dealloc编辑,几乎可以肯定var