Разница между определением @interface в файлах .h и .m
Обычно мы используем
@interface interface_name : parent_class <delegates>
{
......
}
@end
в файле .h и в файле .m мы синтезируем свойства переменных, объявленных в файле .h.
Но в некотором коде этот метод @interface..... @end также содержится в файле .m. Что это значит? В чем разница между ними?
Также дайте несколько слов о геттерах и сеттерах для файла интерфейса, который определен в файле .m...
Спасибо в Advance
Ответы
Ответ 1
Обычно для размещения помещается дополнительный @interface
, который определяет категорию, содержащую частные методы:
Person.h:
@interface Person
{
NSString *_name;
}
@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)person;
@end
Person.m:
@interface Person () //Not specifying a name for the category makes compiler checks that these methods are implemented.
-(void)startThinkOfWhatToHaveForDinner;
@end
@implementation Person
@synthesize name = _name;
-(NSString*)makeSmallTalkWith:(Person*)person
{
[self startThinkOfWhatToHaveForDinner];
return @"How your day?";
}
-(void)startThinkOfWhatToHaveForDinner
{
}
@end
"Личная категория" (собственное имя для безымянной категории не является "частной категорией", это "расширение класса" ).m предотвращает предупреждение компилятора о том, что методы определены. Однако, поскольку @interface
в .m файле является категорией, вы не можете определить в ней ivars.
Обновление 6 августа '12: Objective-C сложилось с момента написания этого ответа:
Ответ 2
Концепция заключается в том, что вы можете сделать свой проект намного чище, если вы ограничьте .h до общедоступных интерфейсов вашего класса, а затем установите частные детали реализации в этом расширении класса.
когда вы объявляете переменные методы или свойства в файле ABC.h, It означает, что эти свойства и методы переменных могут быть доступны за пределами класс
@interface Jain:NSObject
{
NSString *_name;
}
@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)jain;
@end
@Interface позволяет вам объявлять личные ivars, свойства и методы. Итак, все, что вы заявляете здесь, не может быть доступно извне этот класс. В общем, вы хотите объявить все ivars, свойства и методы по умолчанию как частные
Просто скажите, когда вы объявляете переменные методы или свойства в ABC.m file. Это означает, что эти переменные не могут доступ за пределами класса
@interface Jain()
{
NSString *_name;
}
@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)jain;
@end
Ответ 3
вы даже можете создавать другие классы в файле .m,
например, другие малые классы, которые наследуют класс, объявленный в файле .h, но имеющие несколько незначительное поведение.
Вы можете использовать это в шаблоне factory