Как я могу передать себя в качестве параметра метода? - PullRequest
1 голос
/ 18 ноября 2010

Мне нужно передать себя в метод, как мне это сделать?

Я не знаю, что это за объект "я"?

Я пробовал :(id)dg

Ответы [ 3 ]

7 голосов
/ 18 ноября 2010

Когда вы находитесь внутри блока @implementation для класса Foo, self равен Foo*. Это означает, что вы можете ввести параметр метода как Foo* или id (= любой объект, проверка типов не выполняется):

@class Foo, SomeCollaborator;

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

@implementation Foo
- (void) someFooMethod {
    [someCollaborator doSomethingWithMe:self];
}
@end
3 голосов
/ 18 ноября 2010

Мне это кажется правильным.(id) представляет все возможные объекты.

Вот код, который работает:

@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
0 голосов
/ 18 ноября 2010

Что такое сигнатура метода (другими словами, как метод определяется в интерфейсе)?

Или вы имеете в виду, что вы хотите определить метод в классе B, чтобы позволить экземпляру класса A вызывать этот метод и передавать его в качестве одного из параметров? Если это так, отправитель: (id) часто используется как общий способ сделать это. Например, в NSWindow,

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

В рамках реализации этого метода вы можете сделать что-то подобное, чтобы определить, что делать:

- (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 
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...