2011-01-06 19 views
19

İşe Alım için ileriye doğru giderken sorun yaşıyorum. Bazı nedenlerle, Objective-C çalışma zamanı forwardInvocation: yöntemimi tamamen yok sayar ve tanınmayan bir seçici istisnası atar.forwardBaşvuru çağrılmıyor mu?

@interface InvocationTest : NSObject 
{ 
} 

+ (void) runTest; 

@end 


@interface FullClass: NSObject 
{ 
    int value; 
} 
@property(readwrite,assign) int value; 

@end 

@implementation FullClass 

@synthesize value; 

@end 


@interface SparseClass: NSObject 
{ 
} 

@end 

@implementation SparseClass 

- (void)forwardInvocation:(NSInvocation *)forwardedInvocation 
{ 
    NSLog(@"ForawrdInvocation called"); 

    FullClass* proxy = [[[FullClass alloc] init] autorelease]; 
    proxy.value = 42; 
    [forwardedInvocation invokeWithTarget:proxy]; 
} 

@end 


@implementation InvocationTest 

+ (void) runTest 
{ 
    SparseClass* sparse = [[[SparseClass alloc] init] autorelease]; 
    NSLog(@"Value = %d", [sparse value]); 
} 

@end 

aşağıdaki kaynaklardan gelen bilgileri kapalı çalışıyorum: söyleyebilirim

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html#//apple_ref/doc/uid/TP40008048-CH105 http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html

Bildiğim kadarıyla, çalışma zamanı gerektiği şöyle

Testim kodudur forwardingvocation çağırıyor: SparseClass örneğinde [seyrek değer] çağırdığımda, ancak tamamen yok sayılır:

- [SparseClass değer]: -:

'tanınmadı seçici örneği 0x4b1c4a0 gönderilen [SparseClass değer]:' tanınmadı seçici nedeniyle yakalanmamış istisna 'NSInvalidArgumentException', akıl uygulamayı sonlandırılması *** örneğine 0x4b1c4a0 gönderilen

cevap

36

Çalışmak için - (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector'u geçersiz kılmanız gerekir.

Ben

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { 
    return [FullClass instanceMethodSignatureForSelector:aSelector]; 
} 

ok olmalıdır sanırım. NSObject belgelerine

+1

Awesome! Bir çekicilik gibi çalıştı. – Karl

24

:

Önemli: nesne kendisi sen forwardInvocation: ilaveten methodSignatureForSelector: geçersiz kılmalıdır tanımıyor yöntemlere yanıt vermek. İletileri iletme mekanizması, iletilecek NSInvocation nesnesini oluşturmak için methodSignatureForSelector:'dan alınan bilgileri kullanır. Geçersiz kılma yönteminiz, önceden seçerek ya da başka bir nesne sorarak, belirli bir seçici için uygun bir yöntem imzası sağlamalıdır. Bir nesne aldığı herhangi bir uzak mesajlar iletir, eğer sonuçta yanıt yöntemlerin doğru açıklamalarını dönebilirsiniz methodSignatureForSelector: bir sürümüne sahip olmalıdır ...

: runtime belgelerinden

Ve iletilen mesajlara; Bir nesne bunun yerine kullanılacak bir mesaj iletmek mümkün olup olmadığını şöyle örneğin, sen methodSignatureForSelector: uygulamak olacaktır:

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector 
{ 
    NSMethodSignature* signature = [super methodSignatureForSelector:selector]; 
    if (!signature) { 
     signature = [surrogate methodSignatureForSelector:selector]; 
    } 
    return signature; 
} 

Not: Bkz Jilouc en answermethodSignatureForSelector: doğru uygulanması için.

+13

Apple'ın Runtime Programming Guide belgelerinin bu konuda başarısız olduğunu düşünüyorum. "Yönlendirme" bölümünde, "forwardInvocation:" ile "methodSignatureForSelector:" öğesine gereksinim duyma hakkında hiçbir şey belirtmediler. Bu üçgeni bulmak için bir bölüm yöntemi uygulamanız gerektiğini öğrenmek için 3 bölüm aşağı kaydırmış olursunuz. – DBD

İlgili konular