Можно ли объявить метод Objective-C вне класса? - PullRequest
10 голосов
/ 02 февраля 2012

Я знаю, что вы можете объявить функцию C вне класса, но возможно ли объявить метод Objective-C вне класса?

Пример:

// Works
void printHelloC()
{
    NSLog(@"Hello.");
}

// Error
-(void) printHelloOC
{
    NSLog(@"Hello.");
}

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        printHelloC();
        [self printHelloOC];// 'self' obviously would not work but you get the idea
    }
    return 0;
}

Ответы [ 5 ]

5 голосов
/ 02 февраля 2012

Это зависит. Вы можете сделать нечто подобное с добавлением метода во время выполнения:

#import <objc/runtime.h>

void myCustomMethod(id self, SEL _cmd, id arg1, id arg2)
{
    NSLog(@"This is a test, arg1: %@, arg2: %@", arg1, arg2);
}

int main(int argc, char *argv[])
{
    Class NSObjClass = [NSObject class];

    class_addMethod(NSObjClass, @selector(myNewMethod::), (IMP) myCustomMethod, "v@:@@");

    NSObject myObject = [NSObject new];

    [myObject myNewMethod:@"Hi" :@"There"];

    [myObject release];

    return 0;
}

Но это все, что находится за пределами конструкции @class, и в действительности это просто скрывает то, что происходит с категорией.

5 голосов
/ 02 февраля 2012

Для этого вы можете использовать категорию .

Как метод экземпляра:

@interface NSObject (MONStuff)
- (void)printHelloOC;
@end

@implementation NSObject (MONStuff)
- (void)printHelloOC
{
  NSLog(@"Hello.");
}
@end

// in use:

NSObject * obj = ...;
[obj printHelloOC];

Как метод класса:

@interface NSObject (MONStuff)
+ (void)printHelloOC;
@end

@implementation NSObject (MONStuff)
+ (void)printHelloOC
{
  NSLog(@"Hello.");
}
@end

// in use:

[NSObject printHelloOC];

Конечно, вы должны связать это с классом - так что это не точно то же самое, что вы отправили, но это близкое определение + объявление, отдельное от формального объявления класса.

0 голосов
/ 02 февраля 2012

Нет, это невозможно - вам нужно будет либо использовать глобальные функции C, либо методы класса (+).

0 голосов
/ 02 февраля 2012

Объективные функции c всегда связаны с классом.Если вы хотите использовать функцию target-c без создания экземпляра класса, вы, конечно, можете написать метод класса (обратите внимание на знак плюс вместо обычного дефиса)

@interface Test

+ (void)aClassMethod;

@end

, затем вы можете вызвать егопо телефону

[Test aClassMethod];
0 голосов
/ 02 февраля 2012

Метод без ассоциированного класса - бессмысленное понятие.Функции, как вы заметили, просто хороши.

...