1

カテゴリについて学ぶ前に、生成された NSManagedObject サブクラスでエンティティのメソッドを宣言しました。

// UserRecording.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#import <AVFoundation/AVFoundation.h>

@interface UserRecording : NSManagedObject {
    AVAudioPlayer *audioPlayer;
}

@property (nonatomic, retain) NSDate * dateCreated;
@property (nonatomic, retain) NSData * audioData;
@property (nonatomic, retain) NSString * name;

-(void) URplay;

@end

実装は次のとおりです。

// UserRecording.m


#import "UserRecording.h"

@implementation UserRecording

@dynamic dateCreated;
@dynamic audioData;
@dynamic name;

-(void) URplay {
    NSError *error;
    audioPlayer = [[AVAudioPlayer alloc] initWithData:self.audioData error:&error];
   [audioPlayer play];
}

@end

(Stanford iTunes U のビデオで) カテゴリについて学んだとき、コードをカテゴリに移動しました。しかし、音は再生されなくなりました。唯一の違いは、宣言されたインスタンス変数 (IVAR) がなかったことです。確かに、古いコードでテストしました。上記のコードは音声を再生しますが、このコードは再生しません (シミュレーターで):

// UserRecording.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@interface UserRecording : NSManagedObject

@property (nonatomic, retain) NSDate * dateCreated;
@property (nonatomic, retain) NSData * audioData;
@property (nonatomic, retain) NSString * name;

-(void) URplay;

@end

そして実装:

// UserRecording.m

#import "UserRecording.h"
#import <AVFoundation/AVFoundation.h>

@implementation UserRecording

@dynamic dateCreated;
@dynamic audioData;
@dynamic name;

-(void) URplay {
    NSError *error;
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithData:self.audioData error:&error];
   [audioPlayer play];
}

@end

ARCと関係あるのかな?しかし、関係なく、私は何ができますか?カテゴリでインスタンス変数を宣言することはできません。

4

2 に答える 2

0

AVAudioPlayer は、インスタンス化した直後に割り当てが解除されるという意味で、ARC と関係があります。ARC では、スコープを離れるときにローカル変数の割り当てが解除されるため、そのプロパティを宣言してみてください。ivar 自体は必要ありません。 :

ヘッダー ファイルまたは実装のインターフェイス宣言:

@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

実装時:

@synthesize audioPlayer = _audioPlayer;

この最後の部分は、プロパティの ivar_audioPlayerを暗黙的に作成します。直接アクセスできますが、セッターをスローすることをお勧めしself.audioPlayer =ます。

于 2012-07-12T17:48:37.593 に答える
0

Apple Developer Forums で学んだことを言い換えます。

ARC により、ローカル変数はスコープを離れると割り当てが解除されます。したがって、メソッドで宣言された AVAudioPlayer は、再生する前に消えてしまいます。一部のコンテキストでは IVAR を追加できますが、ここではできません。これは、IVAR をカテゴリに追加できないためです。詳しく説明すると、上記の NSManagedObject サブクラスは XCode によって生成されます。エンティティに IVAR を追加すると、エンティティを変更して再生成すると XCode によって上書きされます。

したがって、解決策は、永続的な AVAudioPlayer をどこに置くべきかを再考することです。おそらく、永続的な AVAudioPlayer* を引数としてカテゴリのメソッドに追加し、メソッドが呼び出されたときにそれを渡します。

于 2012-07-12T18:48:18.030 に答える