Objective-Cのメモリ管理ブロック、アークおよび非アーク
質問
ついてのブロックのための時間が感じるものがあんてメモリ管理の両アークおよび非アーク環境です。感じることへの理解が深まvoid多くのメモリ解放されます。
AFNetworkingは私の主な利用のブロックに特願います。ほとんどの時間内に完了ハンドラの操作とは思いものを含んではならない。myArray addObject]".
両アークおよび非アーク有効の環境では、"自己"保管されることによ この記事Apple.
ということでも完成ブロックのAFNetworkingネットワークオペレーションが呼び出、自己が保有するとブロックされた場合に放出されるブロックという体制を取っている。この両方に適用されるアークおよび非。私たもの漏えいツールと静的解析その場合のメモリ解放されます。無した。
したものではない、最近に見警告するか。を使用してい弧この特定の例です。
私は二つのインスタンスを示す変数の完了、故障のネットワーク運用
@property (nonatomic, readwrite, copy) SFCompletionBlock completionBlock;
@property (nonatomic, readwrite, copy) SFFailureBlock failureBlock;
@synthesize failureBlock = _failureBlock;
@synthesize operation = _operation;
のどこかにコードが、これは:
[self.operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id
responseObject) {
NSError *error = [NSError errorWithDomain:@"com.test" code:100 userInfo:@{@"description": @"zero results"}];
_failureBlock(error);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"nothing");
}];
Xcode苦情のラインを呼び出failureBlockのメッセージ"獲る"自己"と強くこのブロックが結果を保持します。と思いXcodeでright:失敗をブロックを保持し、自己および自己保有そのコピーブロック、マッサージしていただくとよりのする割.
しかしながら、以下の問いる。
1)変更した場合、購入した_failureBlock(エラー)"。failureBlock(エラー)"(クォート)のコンパイラを停止し(?)この理由は何でしょうか?このメモリリークのコンパイラのヒント?
2)一般に、何の仕事をブロックの両方のアークおよび非アーク有効な環境利用の場合 ブロックするインスタンス変数?う場合の完了、故障ブロックAFNetworking、二つのブロック ない インスタンス変数をかいていないのかもしれませんは、残サイクルとします。を用いる場合の進捗をブロックをAFNetworking、何をするために行うことができます回避残サイクルのようにしますのでご注意ください。▼
思他人の思考にアークおよび非アークとブロック課題解決メモリ管理.見た状態でのエラーが発生しやすいかという手ごたえを感じるように議論する必要があることがわかり明確なものです。
わからない場合でも使えXcode4.4最新のLLVM.
解決
1)変更した場合、購入した_failureBlock(エラー)"。failureBlock(エラー)" (クォート)のコンパイラを停止し(?)この理由は何でしょうか?この メモリリークのコンパイラのヒント?
の維持をサイクルが存在しました。がんを対象にiOS5+とすることができます弱者の参考自己:
__weak MyClass *weakSelf;
[self.operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSError *error = [NSError errorWithDomain:@"com.test" code:100 userInfo:@{@"description": @"zero results"}];
if (weakSelf.failureBlock) weakSelf.failureBlock(error);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"nothing");
}];
現在の自己はな留めの場合は割前のコールバック関数が呼び出され、コールバックは何もしません。.しかし、これを可能にすることが解放を受けるが、コールバック関数が呼び出された背景にスレッドでこのパターンを作成でき折々がクラッシュします。
2)一般に、何の仕事をブロックの両方 アークおよび非アーク有効な環境での使用時にブロックする インスタンス変数には?う場合の完成に失敗 ブロックAFNetworking、二つのブロックなインスタンス変数で ることができるのだろうかに該当サイクルを維持するた 上述した.を用いる場合の進捗をブロックをAFNetworking, 何ができるのを避ける残サイクルのようにしますのでご注意ください。▼
ほとんどの時間だと思い と良い!写真保存プロジェクトのブロックにインスタンス変数.る場合は戻り、ブロックからの方法が、クラスまだまだ残サイクルでのみ存在するから時間のメソッドが呼び出されるのをブロックが外れます。そのようなインスタンスからの割時のブロックの実行が、残サイクル終了時のブロックの公開:
-(SFCompletionBlock)completionBlock {
return ^(AFHTTPRequestOperation *operation , id responseObject ) {
[self doSomethingWithOperation:operation];
};
}
[self.operation setCompletionBlockWithSuccess:[self completionBlock]
failure:[self failureBlock]
];
他のヒント
ということでも完成ブロックのAFNetworkingネットワーク オペレーションが呼び出、自己が保有するとブロック発売 その場合ブロックという体制を取っている。
いいえ、 self
が保有するブロックの場合にブロックが作成されます。でのブロックを割.
と思いXcodeでright:失敗をブロックを保持し、自己および自己 を持ってコピーのブロック、マッサージしていただくとよりのす 割.
ブロックの問題を保持 self
の完成ですブロックに渡される setCompletionBlockWithSuccess
. self
なにこのブロックです。むしろ、 self.operation
と思われるか NSOperation
)は、ブロックですが。があるので一時的に周期的にやってきます。しかし、その操作または処理が行われた実行のサイクルが壊れているようです。
1)変更した場合、購入した_failureBlock(エラー)"。failureBlock(エラー)" (クォート)のコンパイラを停止し(?)この理由は何でしょうか?この メモリリークのコンパイラのヒント?
ありません。 self
が撮影されました。のコンパイラを保証するものではありません釣れる場合を除いて残サイクルです。