2010-11-18 3 views
1

J'ai besoin de passer moi-même dans une méthode, comment puis-je le faire?Comment faire je passe self comme paramètre de méthode?

Je ne sais pas quel type d'objet est le soi?

J'ai essayé :(id)dg

+0

Quel est le résultat de la spécification comme '(id)'? Comment appelez-vous la méthode? – BoltClock

+0

Pourquoi ne connaissez-vous pas la classe de soi? Ce code n'est-il pas dans la même classe ?! * id * devrait fonctionner, comme probablement * NSObject **. – Eiko

+0

Vous pouvez utiliser des noms plus descriptifs que * db *. Vous vous remercierez plus tard lorsque vous devrez corriger un bug. –

Répondre

7

Lorsque vous êtes à l'intérieur d'un bloc @implementation pour une classe Foo, self est Foo*. Cela signifie que vous pouvez saisir le paramètre de méthode comme Foo* ou id (= un objet, pas de type vérification faite):

@class Foo, SomeCollaborator; 

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

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

Quelle est la signature de la méthode (autrement dit, comment est la méthode définie dans l'interface)? Ou voulez-vous dire que vous voulez définir une méthode dans la classe B pour permettre à une instance de la classe A d'appeler cette méthode et de passer en elle-même comme l'un des paramètres? Si oui,: (id) expéditeur est souvent utilisé comme un moyen générique de le faire. Par exemple, dans NSWindow,

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

Dans la mise en œuvre de cette méthode, vous pouvez faire quelque chose comme ceci pour aider à déterminer ce qu'il faut faire:

- (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

Cela me semble juste. (id) représente tous les objets possibles.

est ici un code qui fonctionne:

@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 
Questions connexes