我对ObjC及其可变数组很新。这让我发疯; - )
我执行以下操作:
mColumns = [NSMutableArray array];
for( int i=0; i<5; i++ ) [mColumns addObject:[[MyColumn alloc] init]];
在那段代码之后,我的数组“mColumns”包含5个元素。但它们每个都是一个NULL指针! (或者至少那是调试器告诉我的)。 我已经检查了代码
[[MyColumn alloc] init]
给了我一些有效的对象,所以我不知道为什么我的数组充满了0x0。 你能给我一个暗示吗?
答案 0 :(得分:2)
如果你想让它坚持下去,请保留你的mutableArray。在当前事件循环结束时,它将自动解除分配,就像在autoreleasePool中一样。
此时所有赌注都已关闭。你的 mColumns 变量只指向一块垃圾内存,可能是另一个对象,也许是半个对象,甚至你仍然可以得到正确的数量甚至是一个包含的对象,但在某些时候你的应用程序将会崩溃。
只是一个快速点,如果[[mColumns objectAtIndex:x] addObject:g];
崩溃你的应用是导致崩溃的[mColumns objectAtIndex:x]
还是addObject:g
?
为什么不把它们分开来找出来?
答案 1 :(得分:0)
我知道你说对象分配正确,但我倾向于检查它。这是相同的代码和更多的调试:
NSMutableArray *mColumns = [NSMutableArray array];
for( int i=0; i<5; i++ ) {
MyColumn *col = [[MyColumn alloc] init];
NSLog(@"%d: %@", i, col);
[mColumns addObject:col];
[col release];
}
NSLog(@"Array has %d elements, first is %@", [mColumns count], [mColumns objectAtIndex:0]);
问题可能是(a)没有正确创建对象,或者(b)数组确实有元素而你有不同的问题。
答案 2 :(得分:0)
嗯。我可以在您的代码中看到一个问题,但不会出现导致此问题的问题:您要将保留的对象添加到数组中;你首先想要自动释放那些,这样你就不会泄漏。
至于你的实际问题,我不知道。用空指针填充数组是不可能的;只有id
类型的对象(非任意指针)才能放在NSArray
/ NSMutableArray
内。
我知道你说你已经检查了-[MyColumn init]
,但是检查它是否在这个地方产生了正确的物体是个好主意。
columns = [NSMutableArray array];
for (int i = 0; i < 5; i++) {
id c = [[[MyColumn alloc] init] autorelease];
/* set a breakpoint here, and type `po c`
into the debugger to see what was created
*/
[columns addObject:c];
}
除非-[MyColumn init]
制作一些非常时髦的物品,否则我无法弄清楚问题会是什么。 我想知道mColumns
是否发生了一些奇怪的事情;它是由任何东西保留的,例如?