我通常同意其他答案,你應該嘗試找到另一種方式來做到這一點,因爲選擇器和塊是真的不可以互換。但是,如果你絕對必須做這種方式,我覺得這樣的事情將是你最好的選擇:
// 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);
}];
...
我不是太肯定所有的內存管理在這裏,所以別人會仔細檢查我這句話。
也許我不明白,爲什麼不直接打電話給我? block(param); – ssteinberg 2012-04-20 12:44:49
是的,我不明白你在問什麼。這沒有意義。在這個例子中,接收者「self」扮演什麼角色? – 2012-04-20 13:01:25
@ssteinberg,爲了簡單起見,我寫了這兩行。實際上,我正在測試其他一些方法「exportToSelector:onTarget:WithObject」。該方法接收選擇器和目標,是否有作業和回調以選擇器,數據對象爲目標,並且我需要檢查這些數據。所以,在我的測試方法中,我想通過「exportToSelector:onTarget:WithObject」中的塊並檢查塊中的結果。在這種情況下,所有可測試代碼將保留在一種測試方法中。 – Centurion 2012-04-20 13:12:38