2010-06-17 5 views
4

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

Я читал, чтобы увидеть, если я мог бы найти сокращенную альтернативу, и я наткнулся на эту статью на developer.apple.com: Defining a Class

Он говорит, между прочим, что

id newInstance = [[self alloc] init]; 

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

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

ответ

6

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]; 
+1

Ах, хорошо, я не заметил из этой статьи, что это был метод класса и WASN» я знал, что в таких методах даже было «я». Спасибо за это. Итак, тогда определим возможное решение. Я рассмотрю еще кое-что. – user362178

3

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

id newInstance = [[[self class] alloc] init]; 
Смежные вопросы