2011-07-10 9 views
5

Yapım Konumum var, şöyle:StructSelector: withObject: afterDelay öğesinin yapısını geçirin:

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

NSObject performSelector:withObject:afterDelay:'de nasıl iletebilirim? Bunun gibi:

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

DÜZENLEME: değiştirilmiş kod yazım hatası

cevap

3

Sen NSValue sınıfını kullanarak özel tipini sarabilirdiniz düzeltmek için kod değiştirdi. Hata, yönteme bir nesne referansı vermediğinizdir.

NSValue 's +(NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type; sınıf yöntemiyle kullanmayı deneyin. Diğer tarafta -(void)getValue:(void *)buffer; kullanarak değeri alabilirsiniz.

9

Uhm .. Bir CGPoint ve

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

gibi bir şey kullanmak Ve uzakta tamamen pozisyonu sınıfını

NSValue v; 
CGPoint point = [v CGPointValue]; 

olarak tekrar okumak ya bırakın CGPoint yok aynı

0

preformSelector:withObject: kabul Yalnızca nesneler olarak nesneler kabul edilir, dolayısıyla bir nesneyi kabul etmek için foo: yönteminizi uygulamanız gerekir.

  • bir yapı gibi bir nesne oluşturmak veya
  • NSValue içine sarmak ve yöntemde ambalajından: bir nesne olarak yapı geçirmek için iki yol vardır.
0

Tam yanıt, kullanıcı756245'lere dayanarak (bunun nasıl kullanıldığını söylemez, çok fazla yardım gerektirmez). Ayrıca, Apple, biraz farklı bir yöntem bu günlerde, IIRC kullanmak öneriyor:

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

Bu büyük olasılıkla sorun istiyor, ancak bu şekilde bunu köprüleyerek id olarak CGPoint geçirebilirsiniz:

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

point kapsam dışı kaldığında ve seçiciniz bunu okumaya çalışırsa, bu çökmeye neden olur.

İlgili konular