Использование категории в Objective-C - PullRequest
6 голосов
/ 12 декабря 2008

Я вижу некоторый унаследованный код, который выглядит следующим образом:

@interface SomeClass (private)

Это в SomeClass.m, файле реализации. Существует сопроводительный заголовочный файл, который не предполагает, что класс использует категорию. Является ли (private) в этом случае просто плохим именем, присвоенным категории для SomeClass? И я предполагаю, что вполне допустимо указывать такие категории в реализации?

Ответы [ 3 ]

31 голосов
/ 12 декабря 2008

Это не имя "личное", которое делает его частным; методы являются частными, потому что они находятся в категории, объявленной в файле реализации.

Существует три варианта использования категории, каждый из которых добавляет методы в класс (примечание: только методы, а не iVars)

Расширение существующего класса какао

Это позволяет вам добавлять свои собственные методы в существующий класс. Например, если вы хотите расширить NSString для применения специальной заглавной буквы, вы можете создать новый класс с именем, например, NSString + Capitals. в NSString + Capitals.h вы должны иметь:

@interface NSString (Capitals)

-(NSString *)alternateCaps:(NSString *)aString;

@end

и в NSString + Capitals.m вы реализуете метод

@implementation NSString (Capitals)
-(NSString *)alternateCaps:(NSString *)aString
{
    // Implementation
}

Частные методы в классе

Это то же самое, что и выше, за исключением того, что дополнительные методы объявляются и определяются в файле реализации (.m). Обычно это способ иметь закрытые методы - потому что их нет в файле .h (который является # импортируется другими классами) их просто не видно. В этом случае реализация методов осуществляется в собственном блоке реализации. * 1019 например *

// someClass.m
@interface someClass (extension)
-(void)extend;
@end

@implementation someClass
    // all the methods declared in the .h file and any superclass
    // overrides in this block
@end

@implementation someClass (extension)
-(void)extend {
    // implement private method here;
}

Расширение класса (Новое для 10,5 леопардов)

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

// someClass.m
@interface someClass ()
-(void)extend;
@end

@implementation someClass
    // all the methods declared in the .h file and any superclass
    // overrides in this block
    // Implement private methods in this block as well.
-(void)extend {
    // implement private method here;
}

@end

Вот ссылка на документы Apple по категориям и расширениям.

2 голосов
/ 12 декабря 2008

Я использую это, чтобы дать мне возможность где-то объявлять (и, таким образом, документировать, а также закрывать компилятор) вспомогательные методы, которые не должны присутствовать в открытом интерфейсе. Тогда «потребители» класса (молчаливо, учитывая, что ничто не мешает им, кроме хороших манер) ограничены использованием методов, определенных в заголовочном файле.

2 голосов
/ 12 декабря 2008

«Private» - это просто имя, которое предполагает, что методы не являются общедоступными и используются для внутренней реализации класса, но в объявлении категории нет ничего, что обеспечивало бы это.

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

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