メソッドを呼び出すために使用したいかなり複雑な引数のセットがある場合は、引数を構成を保持するものにキャプチャし、その構成に基づいて必要なことを何でも実行できるようにすることをお勧めします...
このようなインターフェースを持つもの:
PositionSetter.h:
@interface PositionSetter : NSObject
{
NSInteger x;
NSInteger y;
Sprite *target;
}
+ positionSetterWithX: (NSInteger) xPos y: (NSInteger) yPos sprite: (Sprite *) aSprite;
- (void) applyPosition;
@end
PositionSetter.m:
@interface PositionSetter()
@property(readwrite, nonatomic) NSInteger x;
@property(readwrite, nonatomic) NSInteger y;
@property(readwrite, nonatomic, retain) Sprite *target;
@end
@implementation PositionSetter
@synthesize x, y, target;
+ positionSetterWithX: (NSInteger) xPos y: (NSInteger) yPos sprite: (Sprite *) aSprite;
{
PositionSetter *positionSetter = [PositionSetter new];
positionSetter.x = xPos;
positionSetter.y = yPos;
positionSetter.target = aSprite;
return [positionSetter autorelease];
}
- (void) applyPosition;
{
[self.target setPosition:CGPointMake(self.x,self.y)];
}
@end
使い方はとても簡単です:
positionSetter = [PositionSetter positionSetterWithX: 42 y: 21 sprite: mySprite];
[positionSetter performSelector: @selector(applyPosition) withObject: nil afterDelay: 1.0];
少しコードが増えますが、結果として得られる実装は十分に高速です。おそらく NSInvocation よりも高速ですが、これが描画を引き起こすことを考えると、無関係であるほど高速であり、はるかに柔軟です。上記をリファクタリングして、たとえば CoreAnimation を駆動することが簡単にわかりました。