1

私はこの問題を抱えています:ブロック内のブロック。

  self.createStuff = ^ (NSString *text) {       
        self.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error){
                [self doStuff];  // error here
        };
        [self doMoreStuff];  // error here
  };

[self doStuff] と [self doMoreStuff] でエラーが発生します。エラーは、このブロックで「自己」を強力にキャプチャしているため、保持サイクルが発生する可能性があります

簡単に言えば、追加するだけです

id mySelf = self; 

最初のブロックの前に置き、代わりに mySelf を使用してください。

いいえ。mySelf が kind id であると、2 行目で必要な post プロパティが得られないため、これは私の問題を解決しません。だから私はそれを次のように宣言する必要があります

MyClass *mySelf = self;

次のようにします。

MyClass *mySelf = self;

  self.createStuff = ^ (NSString *text) {       
        mySelf.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error){
                [self doStuff];  // error here
        };
        [mySelf doMoreStuff];  
  };

OK、あなたが言うには、self.post.onCompletion 行と doMoreStuff はもう文句を言いませんが、onCompletion 内に別の自己があります...これはブロック内のブロックであるためです。のような別の弱参照を作成するプロセスを繰り返すことができます。これは、弱参照への弱参照でなければなりません。

MyClass *internalMyself = mySelf;

と使用

   [internalMyself doStuff];

これは、これを行うための非常に哀れな方法のように思えます。このメソッドを実行すると、アプリがハングします。メソッドが実行される前に、参照のようなものが割り当て解除されています...

このシャレードを解決するにはどうすればよいですか?

ありがとう。


注:これはiOS 6+にコンパイルされています

4

1 に答える 1

6

あなたはかなり近いです。ソリューションを置き換えるだけ

MyClass *mySelf = self;

self.createStuff = ^ (NSString *text) {       
     mySelf.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error) {
          [self doStuff];  // error here
     };
     [mySelf doMoreStuff];  
};

__weak MyClass *mySelf = self;

self.createStuff = ^ (NSString *text) {       
     mySelf.post.onCompletion = ^(NSURLResponse *response, NSData *data, NSError *error) {
          [self doStuff];  // error here
     };
     [mySelf doMoreStuff];  
};

最初のソリューションの問題は、それmySelfが指定されていないweakため、所有権修飾子が暗黙的に指定されていることです__strong( LLVM のドキュメントを参照してください)。これにより最初のブロックの警告が消える理由はわかりませんが、参照を指定__weakすると保持サイクルが完全に削除されます。

于 2013-02-02T23:36:01.347 に答える