2012-05-18 2 views
2

В последнем verson ox xCode (4.3) я видел, что префиксные шаблоны (например, шаблон Master/Detail), в котором объявление интерфейса сделано в файле .m. Например, в файле MyFile.h есть:Объявить интерфейс внутри файла реализации (Objective-C)

@interface MyFile 

@property (nonatomic, retain) NSString *someProp; 

@end 

И в файле MyFile.m есть:

@implementation MyFile 

@interface MyFile { 
    NSString * anotherProp; 
} 

- (id) init... 

Почему это сделано на этом пути? Почему anotherProp не объявлен в файл MyFile.h?

Заранее спасибо

+1

Это не то, на что это похоже, потому что это неверный код. Вероятно, это: '@interface MyFile() {NSString * anotherPropt} @end @implementation MyFile - (id) init {...', и в этом случае см .: http://stackoverflow.com/questions/9751057/what- in-m-files-used-for-in-ios-5-projects –

+0

Вы правы, я разместил его из памяти, и я забыл скобки – rai212

ответ

5

Ну его не объявил этот путь, но это так: -

@interface ClassName() { 

    Declarations; 

} 

Methods; 

@end 

Это называется класс extension.They похож на категорию, но может быть объявлен только в реализации класса не в каком-либо другом классе. Использование расширений - это переопределить свойство, которое является общедоступным или readwrite, а также объявлять новые, если это необходимо. Они просто позволяют вам объявлять свойства и переменные в местах, отличных от @interface, так что имя extensios.

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

+0

Вы правы, я забыл скобка. Спасибо за ваше объяснение, я понимаю это сейчас. – rai212

+1

Категории могут также делать непубличные методы (поскольку любой метод является «непубличным» в ObjC, так или иначе), если их объявление скрыто. Различия заключаются в том, что методы, объявленные в расширениях, должны быть определены в основном блоке @implementation класса, и эти расширения могут (как и несколько предыдущих версий компилятора) объявить ivars. –

+0

@roronoa Как получить доступ к методам класса интерфейса внутри реализации другого класса? Я пытаюсь объявить это имя класса интерфейса в другом классе представления, что имя класса не заполнено .... – SnakingPrabhu

Смежные вопросы