1

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」バージョンを使用するのが正しい方法のようです。

私が間違っている可能性がある場所についてのアイデアはありますか?

4

1 に答える 1

0

見てみると、それが aであり、整数を渡していることがわかりますdecodeBytesForKey:returnedLength:。メソッドは を返すだけでなく、データを取得するには逆参照する必要があります。returnedLengthNSUInteger*const uint8_t*

それ以外の

[self setMAudioUnit:(AudioUnit)[aDecoder decodeBytesForKey:@"mAudioUnit" returnedLength:sizeof(AudioUnit)]];

そのはず

NSUInteger szAudioUnit;
const uint8_t* audioUnitBytes = [aDecoder decodeBytesForKey:@"mAudioUnit" returnedLength:&szAudioUnit];
AudioUnit* pAudioUnit = (AudioUnit*)audioUnitBytes;
self.mAudioUnit = *pAudioUnit;

実際、私はあなたがどのようにコンパイルしたのかさえ知りません!

余談ですが、私の意見かもしれませんが、Objective-C ではプロパティにmプレフィックスを付けることは慣例ではありません。

于 2013-06-22T01:09:43.603 に答える