Core Audio 型である 3 つのプロパティを含むクラスを作成しました。
@interface AudioFilePlayer : NSObject <NSCoding>
@property (assign) AudioUnit mAudioUnit;
@property (assign) AUNode mNode;
@property (assign) AudioStreamBasicDescription mStreamFormat;
@end
私のアプリは AudioFilePlayer タイプのオブジェクトの配列を保持しており、NSCoding を使用してそれらをアーカイブおよびアーカイブ解除したいと考えています。次のように、encodeWithCoder: および initWithCoder: メソッドを作成しました。
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeBytes:(uint8_t*)&_mAudioUnit length:sizeof(AudioUnit) forKey:@"mAudioUnit"];
[aCoder encodeBytes:(uint8_t*)&_mNode length:sizeof(AUNode) forKey:@"mNode"];
[aCoder encodeBytes:(uint8_t*)&_mStreamFormat length:sizeof(AudioStreamBasicDescription) forKey:@"mStreamFormat"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
[self setMAudioUnit:(AudioUnit)[aDecoder decodeBytesForKey:@"mAudioUnit" returnedLength:sizeof(AudioUnit)]];
[self setMNode:(AUNode)[aDecoder decodeBytesForKey:@"mNode" returnedLength:sizeof(AUNode)]];
[self setMStreamFormat:*(AudioStreamBasicDescription*)[aDecoder decodeBytesForKey:@"mStreamFormat" returnedLength:sizeof(AudioStreamBasicDescription)]];
}
return self;
}
正常にエンコード/アーカイブできます (つまり、ファイルが書き込まれ、エラーが返されません...実際に機能しているかどうかはわかりません) が、アプリを起動してオブジェクトをデコード/アーカイブ解除しようとすると、アプリは次のようにクラッシュします。
Thread 1: EXC_BAD_ACCESS (code=2,address=0x4)
私のこの行にinitWithCoder method
:
[self setMAudioUnit:(AudioUnit)[aDecoder decodeBytesForKey:@"mAudioUnit" returnedLength:sizeof(AudioUnit)]];
NSCoding を使用するのはこれが初めてなので、これをリモートで正しく行っているとはまったく確信が持てません。
これら 3 つの Core Audio データ型は構造体であるため、encode/init NSCoder メソッドの「bytes」バージョンを使用するのが正しい方法のようです。
私が間違っている可能性がある場所についてのアイデアはありますか?