2011-07-10 59 views
5

我有一個結構的位置,就像這樣:通行證結構來performSelector:withObject:afterDelay:

typedef struct Position { int x, y; } Position; 

我如何可以通過它在NSObject的performSelector:withObject:afterDelay:?就像這樣:

Position pos; 
pos.x = pos.y = 1; 
[self performSelector:@selector(foo:) 
      withObject:pos    // ERROR 
      afterDelay:5.0f]; 

編輯:改變代碼來解決錯字

回答

3

你可以使用NSValue類包裝你的自定義類型。錯誤是您沒有提供對該方法的對象引用。

嘗試使用NSValue+(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;類方法。另一方面,您可以使用-(void)getValue:(void *)buffer;檢索該值。

9

嗯..用CGPoint和類似

[self performSelector:@selector(foo:) 
      withObject:[NSValue valueWithCGPoint:CGPointMake(pos.x, pos.y)] 
      afterDelay:5.0f]; 

並再次爲

NSValue v; 
CGPoint point = [v CGPointValue]; 

完全消失閱讀或離開位置級別,CGPoint做同樣的

0

preformSelector:withObject:接受只有對象作爲參數,因此您必須實現您的foo:方法才能接受對象。有兩種方法來傳遞該結構作爲對象:

  • 創建一個結構狀物體或
  • 包裹成NSValue和在該方法中解開它。
0

完整的答案,基於user756245的(它不告訴你如何使用它,沒有什麼幫助)。此外,蘋果建議你使用一個稍微不同的方法,這些天,IIRC:

typedef myStruct { int a; } myStruct; 

myStruct aLocalPointer = ... assign to it 

[self performSelector:@selector(myOtherMethod:) withObject:[NSValue value:&aLocalPointer withObjCType:@encode(myStruct)] afterDelay:0.25]; 
0

這很可能是自尋煩惱,但你可以通過這種方式縮小它傳遞CGPointid

withObject:(__bridge id)((void *)(&point))

這會導致崩潰,如果point超出範圍,並且您的選擇器試圖讀取它,但是。