Вызов методов класса через себя - PullRequest
4 голосов
/ 17 июня 2010

У меня есть несколько методов класса в классе с довольно длинным именем (точнее TimingConfigController), и я довольно часто вызываю эти методы из класса (пример: [TimingConfigController intervalStringAt: i]), но длинное имя классаменя беспокоит, потому что операторы становятся очень длинными и менее читаемыми со всем, что в них указано.

Я читал, чтобы найти альтернативную стенографию, и натолкнулся на эту статью на developer.apple.com: Определение класса

В нем, среди прочего, говорится, что

id newInstance = [[self alloc] init];

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

Итак, мои вопросы: возможно ли использование self для вызова метода класса и / или хорошая идея?Есть ли лучшие альтернативы?Было бы ужасно с моей стороны сделать #define Self TimingConfigController в начале файла .m?Или я должен просто принять свои лекарства и жить с неприятностями?

Ответы [ 2 ]

6 голосов
/ 17 июня 2010

self представляет только класс внутри метода класса.Поскольку целью метода класса является класс, self представляет класс.

Например, внутри метода + (void)initialize обычно можно увидеть:

+ (void)initialize {
    if (self == [MyClass class]) { // <- self is the current class
        // ...
    }
}

Есливы действительно хотите сократить имя класса, не переименовывая его, самое простое решение - использовать оператор #define:

#define TCC TimingConfigController

// The two lines are equivalent
id result1 = [TimingConfigController theClassMethod]; 
id result1 = [TCC theClassMethod];
3 голосов
/ 17 июня 2010

Вызов [[self alloc] init] работает только в методах класса, а не в методах экземпляра.Если у вас есть метод экземпляра, и вы хотите создать объект того же класса, вы должны использовать:

id newInstance = [[[self class] alloc] init];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...