0

私は NSOperation で NSOperationQueue を持っています。私の NSOperation .hi には次のプロパティがあります:

@interface MyOperationClass : NSOperation 
@property (strong, nonatomic) NSFetchedResultsController *fetchedResultsController;
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSManagedObject *myObject;
@property (nonatomic, retain) NSMutableArray *myArray;

@end

これは、.m ファイルの NSOperation の dealloc にあります。

- (void)dealloc {
[__fetchedResultsController release];
[__managedObjectContext release];
[myObject release];
[myArray release];
[super dealloc];
}

別のクラスでは、次の方法で操作をキューに追加します。

MyOperationClass *myOperation = [[MyOperationClass alloc] init];
[myOperationQueue addOperation:myOperation];
[myOperation release];

しかし、[myArray release] の行で bad_exc_access を教えてください。私は何を間違っていますか?

編集:コードでこれを行うことに気付きました:

wikiEpisodeArray = [NSMutableArray arrayWithArray:otherArray];

多分これですか?[NSMutableArray alloc] で初期化していませんか?

EDIT 2: 別の同様の問題があります。この変数もあります:

@property (nonatimc, retain) NSString *previousTime;

そして、私はこの方法でそれを初期化しました:

previousTime = [[NSString alloc] init];

そしてコードでは、解放することはなく、dealloc でのみ、次の行で不適切な exc アクセスを受け取ります。

[previousTime release];

解放で...なぜですか?

4

2 に答える 2

1

解放しているオブジェクトにメモリを割り当てていない可能性があります

于 2012-06-02T20:07:14.207 に答える
1

arc がない場合は、(nonatomic、retain) を使用する必要があります (または、保持しない場合は割り当てます)。

また、明示的に割り当てていないオブジェクトは、自動解放して返す必要があります。だからそれらを解放しないでください。

あなたが所有する可変配列を別の配列で作成したい場合は、そうする必要があります

[NSMutableArray alloc] initWithArray:aArray];

NSString の場合は、(nonatomic, copy) を使用します。また、@"something" を使用して nsstring を割り当てると、以前の [NSString alloc] init] を上書きする自動解放されたものを割り当てます。

したがって、文字列を所有したい場合は、次のようにする必要があります。

[NSString alloc] initWithString:aString]; 
于 2012-06-02T20:18:02.007 に答える