0

在我的 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)。

4

1 回答 1

2

您需要保留 soundArray — 您可以在Apple 网站initWithCoder:上阅读 Cocoa 内存管理。

如果您不retain使用 soundArray,它稍后会被dealloc'ed,因为您还没有声称拥有它。基本上,decodeObjectForKey:返回一个已经autoreleased.

于 2010-06-15T02:04:29.097 回答