0

簡単なコードは次のとおりです。

// let's assume that I have to allocate this variable with alloc/init
NSString *someString = [[NSString alloc] initWithFormat:"%@", @"someString"];

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction: someString];
}];

[queue addOperation:op]

[someString release];

someString が解放されてから nsblockoperation が実行されると、このコードはクラッシュします。これを防ぐためのベストプラクティスは何ですか?

ありがとうございました。

編集:ARCは私の決定ではないため、選択ではありません。MRCでこれを回避する方法はありますか?

EDIT2:次のコードはどうですか? それはうまくいくでしょうか?

// let's assume that I have to allocate this variable with alloc/init
NSString *someString = [[NSString alloc] initWithFormat:"%@", @"someString"];

[someString retain]
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction: someString];
  [someString release]
}];

[queue addOperation:op]

[someString release];
4

2 に答える 2

-1

あなたは本当に自動参照カウントを使用し、コードを単純化する必要があります

// let's say the variable is allocated with alloc/init
NSString *someString = @"someString";

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction: someString];
}];

[queue addOperation:op]

手動参照カウントを本当に使用する必要がある場合は、次のようにすることができます。

// let's assume that I have to allocate this variable with alloc/init
NSString *someString = [[NSString alloc] initWithFormat:"%@", @"someString"];

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction: someString];
  [someString release]
}];

[queue addOperation:op]

私はその単なるサンプルコードを知っていますが、そうでない場合は、これを行うこともできます... ;)

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
  [someClass someFunction:@"someString"];
}];

[queue addOperation:op]
于 2014-06-25T19:53:09.610 に答える