В чем разница между + и - при определении свойства метода? - PullRequest
1 голос
/ 10 сентября 2011

и знаки - и + перед объявлением свойства и метода меня сильно смущают. Есть ли разница, если я объявлю метод следующим образом:

- (void)methodName:(id)sender {}

и так

+ (void)methodName:(id)sender {}

Я действительно не понимаю.

Ответы [ 3 ]

6 голосов
/ 10 сентября 2011

Метод '+' является методом класса и может быть вызван непосредственно в метаклассе. Поэтому он не имеет доступа к переменным экземпляра.

Метод '-' - это метод экземпляра с полным доступом к соответствующему экземпляру класса.

* 1005 Е.Г. *

@interface SomeClass

+ (void)classMethod;
- (void)instanceMethod;

@property (nonatomic, assign) int someProperty;

@end

Впоследствии вы можете выполнить:

[SomeClass classMethod]; // called directly on the metaclass

Или:

SomeClass *someInstance = etc;

[someInstance instanceMethod]; // called on an instance of the class

Обратите внимание, что:

+ (void)classMethod
{
    NSLog(@"%d", self.someProperty); // this is impossible; someProperty belongs to
                                     // instances of the class and this is a class
                                     // method
}
1 голос
/ 10 сентября 2011

- (void)methodName:(id)sender {}

- это метод экземпляра, означающий, что вы создаете экземпляр класса и можете вызвать метод для объекта или, на языке Objective-C, отправить сообщение селектору объекта.

+ (void)methodName:(id)sender {}

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

В следующем примереalloc и stringWithString - это методы класса, которые вы вызываете для класса NSString напрямую, объект не требуется.С другой стороны, initWithString - это метод экземпляра, который вы вызываете для объекта, возвращаемого [NSString alloc].

NSString* test = [[NSString alloc] initWithString:@"test"];

NSString* test2 = [NSString stringWithString:@"test2"];
1 голос
/ 10 сентября 2011

Чтобы восхититься ответом @ Tommy, методы (-) будут использовать переменную 'self', которая является экземпляром класса, над которым будет работать метод.Методы (+) не будут иметь этого.

Например, если у вас есть класс FooBar и вы хотите сравнить 2 экземпляра, вы можете выполнить одно из следующих действий:

+ (BOOL) compare:(FooBar)fb1 and:(FooBar)fb2 {
        // compare fb1 and fb2
        // return YES or NO
}

или

- (BOOL) compare:(FooBar)fb2
        // compare self and fb2
        // return YES or NO
}

Вторая подпрограмма имеет переменную «self», которая аналогична fb1 в первой подпрограмме.(Эти процедуры придуманы, но я надеюсь, что вы получите картину.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...