【问题标题】:Where'd my sounds go?我的声音去哪儿了?
【发布时间】:2010-06-15 01:58:08
【问题描述】:

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

【问题讨论】:

    标签: objective-c cocoa nsmutablearray nskeyedarchiver


    【解决方案1】:

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

    如果您不retainsoundArray,它稍后将被dealloc'ed,因为您还没有声称拥有它。基本上,decodeObjectForKey: 返回一个已经是autoreleased 的对象。

    【讨论】:

    • Dane Man:不要跳过 wbyoung 链接到的文档。阅读它,并阅读所有内容。这是每个 Cocoa 和 Cocoa Touch 程序员的必读。
    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 2017-02-06
    • 2011-07-02
    • 1970-01-01
    • 2011-03-03
    • 2014-03-15
    • 2015-07-17
    • 2012-10-30
    相关资源
    最近更新 更多