如何传递一个块作为select器与参数performSelector:withObject:?

是否有可能创build一个块variables作为select器接受参数,并将其传递给performSelector:withObject:? 目前,写一些testing,并希望写一个自包含的方法与所有相关的检查。 需要通过一个块,接收它的参数,并在该块做一些检查。 我正在寻找像这样的东西:

... SEL blockAsSelector = ^{(NSString *param){NSLog(@"Passed param = %@", param);}} [self performSelector:blockAsSelector withObject:stringThatWillBeUsedAsParamInBlock]; ... 

是否有可能创build一个块variables作为select器接受参数,并将其传递给performSelector:withObject:?

不,块和select器是不一样的。

在你的例子中,这是没有意义的。 -performSelector:withObject:在同一个线程上同步运行。 你可能只是执行块,即

 void (^myBlock)(NSString*) = ^(NSString *param){NSLog(@"Passed param = %@", param);}; myBlock(@"foo"); 

如果你想同时在块中完成工作,你可以使用GCD或者NSBlockOperation。

如果您不需要延迟执行操作,则可以:

 [[NSOperationQueue mainQueue] addOperationWithBlock:^(void)block] 

我一般同意其他答案,你应该尝试find另一种方式来做到这一点,因为select器和块是不是可以互换。 但是,如果你绝对必须这样做,我认为这样的事情是你最好的select:

 // BlockWrapper.h @interface BlockWrapper : NSObject @property(nonatomic, retain) void (^block)(NSString*); @property(nonatomic, copy) NSString* string; @end // Your other code file - (void)evaluateBlockWrapper:(BlockWrapper)wrapper { wrapper.block(wrapper.string); } ... BlockWrapper* wrapper = [[BlockWrapper alloc] init]; wrapper.block = ^(NSString* param) { NSLog(@"Passed param = %@", param); } wrapper.string = stringThatWillBeUsedAsParamInBlock; [self performSelector:@selector(evaluateBlockWrapper:) withObject:wrapper]; ... 

虽然这让我想知道为什么你想让块取一个string参数,而不是只引用块内的string:

 // Your other code file - (void)evaluateBlock:(void (^)(void))block { block(); } ... [self performSelector:@selector(evaluateBlock:) withObject:^{ NSLog(@"Passed param = %@", stringThatWillBeUsedAsParamInBlock); }]; ... 

我不太清楚这里的所有内存pipe理,所以别人就不得不再次检查我。