2010-11-18 28 views
1

Kendimi bir yönteme aktarmam gerek, nasıl yapabilirim?Kendimi bir yöntem parametresi olarak nasıl geçebilirim?

Ne tür bir nesnenin kendiliğinden olduğunu bilmiyorum?

Ben

+0

'(id)' olarak belirterek sonucunun ne? Yöntemi nasıl arıyorsun? – BoltClock

+0

Neden kendi kendini sınıfını bilmiyorsun? Bu sınıf aynı sınıfta değil mi ?! * id *, muhtemelen * NSObject ** gibi çalışmalıdır. – Eiko

+0

* Db * 'den daha açıklayıcı isimler kullanmak isteyebilirsiniz. Bir hatayı düzeltmeniz gerektiğinde daha sonra kendinize teşekkür edersiniz. –

cevap

7

Eğer bir sınıf Foo için bir @implementation bloğunun içinde olduğunda:

İşte çalışır bazı kod. Bu (hiçbir gibiler bu Kontrolden = herhangi bir nesne) Eğer Foo* veya id olarak yöntem parametresi yazabilirsiniz anlamına gelir:

@class Foo, SomeCollaborator; 

@interface SomeCollaborator 
- (void) doSomethingWithMe: (Foo*) myself; 
- (void) doSomethingWithMe2: (id) myself; 
@end 

@implementation Foo 
- (void) someFooMethod { 
    [someCollaborator doSomethingWithMe:self]; 
} 
@end 
0

yöntemin imza (başka bir deyişle, nasıl bir yöntem arayüzünde tanımlanır) nedir :(id)dg denedim?

Yoksa, sınıf A'nın bir örneğinin bu yöntemi çağırmasına ve parametrelerden biri olarak kendisine geçmesine izin vermek için B sınıfındaki bir yöntemi tanımlamak mı istiyorsunuz? Eğer öyleyse,: (id) gönderen genellikle bunu yapmak için genel bir yol olarak kullanılır. Bu yöntemin uygulanması çerçevesinde örneğin, NSWindow içinde

- (void)makeKeyAndOrderFront:(id)sender; 
- (void)orderFront:(id)sender; 
- (void)orderBack:(id)sender; 

için ne yapacağını belirlemesine yardımcı olmak için böyle bir şey yapabilirsiniz:

- (void)makeKeyAndOrderFront:(id)sender { 
    if ([sender isKindOfClass:[NSWindowController class]]) { 
    // do something 

    } else if ([sender isKindOfClass:[MyCoolClass class]]) { 
    // do something 

    } else if ([sender respondsToSelector:@selector(whyDidYouOrderMeFront)]) { 
    // do something 

    } else if ([sender conformsToProtocol:@protocol(someCoolProtocol)]) { 
    // do something 

    } else { 
    // do something 
    } 
} 
3

doğru geliyor bana bu. (id) tüm olası nesneleri temsil eder. selfFoo* olduğunu

@implementation Inspector 
- (void)printClassOf:(id)instance { 
    NSLog("instance is of class: %@", [instance class]); 
} 
@end 

@implementation SomeClass 
- (void)someMethod { 
    Inspector *myInstance = [[[Inspector alloc] init] autorelease]; 
    [myInstance printClassOf:self]; 
} 
@end 
İlgili konular