tl;dr
コピー プロパティを宣言します (奇妙な構文、私は知っています... http://fuckingblocksyntax.com/ )
@property (nonatomic, copy) void (^completionHandler)(UIBackgroundFetchResult fetchResult);
次のように使用します
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
self.completionHandler = completionHandler;
}
- (void)actionHere {
if (self.completionHandler)
self.completionHandler(UIBackgroundFetchResultNewData);
}
討論
ブロックはObjective -C の本格的なオブジェクトですが、大きな違いがあります。デフォルトでは、ブロックはスタックに割り当てられます。
ブロックへの参照を保存したい場合は、それをヒープにコピーする必要があります。スタックにブロックを保持しても、スタック フレームが破棄されるたびにブロックが失われるのを防ぐことはできないからです。
ヒープにブロックをコピーするには、Block_Copy()
関数を呼び出す必要があります。必要に応じてcopy
メソッドを呼び出すことができます (前の関数が呼び出されます)。
属性を使用してプロパティを宣言すると、プロパティ セッターを介してオブジェクトを割り当てるたびにcopy
、コンパイラが自動的に呼び出しを挿入します。copy