そのため、NSOperationのサブクラスの初期化子を作成しようとしています。NSOperationを使用するのはこれが初めてです。私のNSOperationサブクラスは次のようになります。
.h
@property (nonatomic, copy) NSString *fileName;
.m
@synthesize fileName = _fileName;
- (id)initWitFileName:(NSString *)fileName {
if (self = [super init]) {
_fileName = fileName;
}
return self;
}
- (void)dealloc {
[_fileName release];
[super dealloc];
}
- (void)main {
// do long task
}
したがって、独自の初期化子を作成するときは、オブジェクトの状態がinitメソッドで決定されていないため、自分でivarを設定する必要があると思いました。したがって、初期化子ではアクセサーを使用しません。mainメソッドを実行すると、メモリのアクセス不良とクラッシュが発生します。ただし、私のinitメソッドで、代わりにこれを行うと、次のようになります。
- (id)initWitFileName:(NSString *)fileName {
if (self = [super init]) {
_fileName = [fileName retain];
}
return self;
}
クラッシュしません。何が正しいですか?この2番目のケースでは、アクセサーが(コピー)であるため、メモリを解放しないと思います。それとも、アクセサーを使用していないため、initWithFileNameメソッドに+1がないために、fileNameオブジェクトが基本的に割り当て解除されますか?ありがとう!