Вопросы, касающиеся частного метода Objective-C - PullRequest
1 голос
/ 30 августа 2010

Ниже приведен пример создания «частных» методов в Objective-C:

MyClass.m

#import "MyClass.h"
#import <stdio.h>

@implementation MyClass
-(void) publicMethod {
    printf( "public method\n" );
}
@end

// private methods
@interface MyClass (Private)
-(void) privateMethod;
@end

@implementation MyClass (Private)
-(void) privateMethod {
    printf( "private method\n" );
}
@end

Почему в этом примере используется имя категории (Private) в объявлениях @interface MyClass (Private) и @implementation MyClass (Private)? Разве интерфейсы не объявлены в файлах .m автоматически закрытыми? Нужны ли нам 2 разных блока реализации?

Есть ли вариант этой техники для создания «защищенных» методов?

(Я новичок в объективе-C. Я упускаю точку с именами категорий? Почему мы должны использовать их в этом случае?)

* 1015 Благодарения и *

Ответы [ 2 ]

2 голосов
/ 30 августа 2010

Если вы создаете категорию, вы должны дать ей некоторое имя. Название Private для категории не имеет особого значения для языка.

Кроме того, в современном Objective-C это было бы лучше для расширения класса , которое объявлено как безымянная категория (@interface MyClass ()), но реализация идет в основном @implementation блок. Это относительно недавнее дополнение, хотя. Метод секретной категории в вашем примере - это более традиционный способ выполнить примерно то же самое.

2 голосов
/ 30 августа 2010

Часть (Private) объявляет категорию для MyClass.Имя категории может быть любым, но все категории, интерпретируемые компилятором, будут добавлять методы из этой категории в список известных методов для этого класса в целом.Поместив закрытые методы в категорию вверху исходного файла, вы можете объявить открытый интерфейс вашего класса в вашем основном файле .h, но все ваши закрытые методы будут «скрыты» внутри файла .m,в то же время вы все еще можете использовать эти методы без предупреждения компилятора о том, что методы не найдены.

Имя категории предназначено только для «классификации» методов класса.Вы можете классифицировать их по своему усмотрению.Имя не имеет значения, простой вызов категории Private не делает эти методы частными, они все еще могут быть переопределены подклассами и могут быть обнаружены с помощью самоанализа.Публичный интерфейс из вашего класса из вашего личного интерфейса.Если вам нужно доставить библиотеку с ее заголовками, то заголовки не будут содержать никаких закрытых методов.

Обычно закрытый интерфейс располагается в верхней части исходного файла, так что компилятор его интерпретирует (и находит все методы, которые предоставляет категория), прежде чем интерпретировать ваши основные и частные реализации.

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