tl;博士
声明一个复制属性(奇怪的语法,我知道... 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
在您通过属性设置器分配对象时自动插入调用。