我通常同意其他答案,您应该尝试找到另一种方法来做到这一点,因为选择器和块实际上并不是可以互换的。但是,如果您绝对必须这样做,我认为这样的事情将是您最好的选择:
// 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];
...
虽然这让我想知道为什么你想让块接受一个字符串参数,而不是仅仅引用块内的字符串:
// Your other code file
- (void)evaluateBlock:(void (^)(void))block {
block();
}
...
[self performSelector:@selector(evaluateBlock:)
withObject:^{
NSLog(@"Passed param = %@", stringThatWillBeUsedAsParamInBlock);
}];
...
我不太确定这里的所有内存管理,所以其他人将不得不仔细检查我。