在我的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)。
答案 0 :(得分:2)
您需要在initWithCoder:
中保留soundArray - 您可以在Apple's site上阅读Cocoa内存管理。
如果您没有retain
soundArray,则稍后会dealloc
编辑,因为您尚未声明对其拥有权。基本上,decodeObjectForKey:
会返回一个autoreleased
的对象。