Objective C - 单独释放方块
Objective C - release blocks individually
我有以下虚拟架构:一个单例 class 将接收一些数据,并且在某些时候(当 return 回调函数被调用时),将 return使用回调的数据。
@interface Helper: NSObject
{
void (^_completionHandler)(int someParameter);
}
+(Helper *)getInstance;
- (void) doSomethingWithCompletionHandler:(void(^)(int))handler;
@end
@implementation Helper
+(Helper *)getInstance {
static Helper *instance = nil;
@synchronized(self) {
if (instance == nil)
instance = [[self alloc] init];
}
return instance;
}
- (void) doSomethingWithCompletionHandler:(void(^)(int))handler
{
//do things
_completionHandler = [handler copy];
//do things
}
-(void) returnCallback
{
int result;
//do things with result
_completionHandler(result);
//nothing to follow, it just returned the result.
}
@end
到目前为止,我只调用了一次助手,一切正常。
例如
[[Helper getInstance] doSomethingWithCompletionHandler:^(int result){
NSLog(@"I received %d", result);
}];
但是现在我需要调用 helper 两次,第二次在第一次里面。
例如
[[Helper getInstance] doSomethingWithCompletionHandler:^(int result){
[[Helper getInstance] doSomethingWithCompletionHandler:^(int result){
NSLog(@" Yay, I'm good %d", result);
}];
NSLog(@"They stopped retaining me:( %d", result);
}];
问题是(如日志中所示)第一个函数回调从内存中释放,我无法访问结果变量。解决这个问题的一种方法是保留回调的 2 个变量(一个是当前变量,一个是旧变量),但是如果我需要第三个变量怎么办?我试图用块引用构建一个 NSMutableArray。但我也必须删除它们,但我不知道如何删除它们。(它们在 Helper class 中被复制,所以我没有在 "Testing" class,我呢?)
以上代码未经过测试,因为这更像是一个基于体系结构的问题。但是,如果有任何错误,我将对其进行测试并尽快编辑消息。
由于您的设计方式,您只能进行一次活动操作。如果您一次尝试执行多个操作,则会发生意想不到的事情(如您的示例所示)。
做这样的事情有一个既定的模式 - 看看 NSOperation
和 NSOperationQueue
,例如here
我有以下虚拟架构:一个单例 class 将接收一些数据,并且在某些时候(当 return 回调函数被调用时),将 return使用回调的数据。
@interface Helper: NSObject
{
void (^_completionHandler)(int someParameter);
}
+(Helper *)getInstance;
- (void) doSomethingWithCompletionHandler:(void(^)(int))handler;
@end
@implementation Helper
+(Helper *)getInstance {
static Helper *instance = nil;
@synchronized(self) {
if (instance == nil)
instance = [[self alloc] init];
}
return instance;
}
- (void) doSomethingWithCompletionHandler:(void(^)(int))handler
{
//do things
_completionHandler = [handler copy];
//do things
}
-(void) returnCallback
{
int result;
//do things with result
_completionHandler(result);
//nothing to follow, it just returned the result.
}
@end
到目前为止,我只调用了一次助手,一切正常。 例如
[[Helper getInstance] doSomethingWithCompletionHandler:^(int result){
NSLog(@"I received %d", result);
}];
但是现在我需要调用 helper 两次,第二次在第一次里面。 例如
[[Helper getInstance] doSomethingWithCompletionHandler:^(int result){
[[Helper getInstance] doSomethingWithCompletionHandler:^(int result){
NSLog(@" Yay, I'm good %d", result);
}];
NSLog(@"They stopped retaining me:( %d", result);
}];
问题是(如日志中所示)第一个函数回调从内存中释放,我无法访问结果变量。解决这个问题的一种方法是保留回调的 2 个变量(一个是当前变量,一个是旧变量),但是如果我需要第三个变量怎么办?我试图用块引用构建一个 NSMutableArray。但我也必须删除它们,但我不知道如何删除它们。(它们在 Helper class 中被复制,所以我没有在 "Testing" class,我呢?)
以上代码未经过测试,因为这更像是一个基于体系结构的问题。但是,如果有任何错误,我将对其进行测试并尽快编辑消息。
由于您的设计方式,您只能进行一次活动操作。如果您一次尝试执行多个操作,则会发生意想不到的事情(如您的示例所示)。
做这样的事情有一个既定的模式 - 看看 NSOperation
和 NSOperationQueue
,例如here