我的声音在哪里?

时间:2010-06-15 01:58:09

标签: objective-c cocoa nsmutablearray nskeyedarchiver

在我的Row类中,我有initWithCoder方法,并且在该方法中恢复的所有内容都可以正常工作,但只能在方法中使用。调用该方法后,我松开了Row类中的一组声音。声音类也有initWithCoder方法,声音播放正常但只在Row类initWithCoder方法中。解码Row对象后,声音阵列完全消失,无法调用。

这是我的initWithCoder的来源:

- (id) initWithCoder:(NSCoder *)coder {
    ...
    soundArray = [coder decodeObjectForKey:@"soundArray"];
    NSLog(@"%d",[soundArray count]);
    return self;
}

日志显示计数为8就像它应该的那样(这是取消归档时)。然后分配我创建的行对象。生成的行对象不再具有soundArray。

[NSKeyedArchiver archiveRootObject:row toFile:@"DefaultRow"];
...
row = [NSKeyedUnarchiver unarchiveObjectWithFile:@"DefaultRow"];

所以现在,每当我调用soundArray时,它都会崩溃。

//ERROR IS HERE
NSLog(@"%d",[[row soundArray] count]);

请帮助(soundArray是一个NSMutableArray)。

1 个答案:

答案 0 :(得分:2)

您需要在initWithCoder:中保留soundArray - 您可以在Apple's site上阅读Cocoa内存管理。

如果您没有retain soundArray,则稍后会dealloc编辑,因为您尚未声明对其拥有权。基本上,decodeObjectForKey:会返回一个autoreleased的对象。