セレクターとブロックは実際にはそれほど交換可能ではないため、これを行う別の方法を見つけようとする必要があるという他の回答に一般的に同意します。しかし、どうしてもこのようにしなければならない場合は、次のような方法が最善の策だと思います。
// 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);
}];
...
ここでのすべてのメモリ管理についてはよくわからないので、他の誰かがそれについて再確認する必要があります。