Разница между определением @ interface in.h и.m-файл
обычно мы используем
@interface interface_name : parent_class <delegates>
{
......
}
@end
метод in .файл H И в .M файл мы синтезируем свойства переменных, объявленных в .H-файл.
но в каком-то коде, это @интерфейс.....@end метод хранится в .файл м также. Что это значит? В чем разница между ними?
также дайте несколько слов о геттерах и сеттерах для файла интерфейса, который определен в .m-файл...
спасибо заранее
3 ответа:
обычно ставится дополнительный
@interface
что определяет категорию, содержащую частные методы:человек.h:
@interface Person { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)person; @end
человек.м:
@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's your day?"; } -(void)startThinkOfWhatToHaveForDinner { } @end
"частная категория" (собственное имя для безымянной категории не является "частной категорией", это "расширение класса").m предотвращает компилятор от предупреждения о том, что методы определены. Однако, потому что
@interface
в рамках .файл m-это категория, в которой вы не можете определить ivars.обновление 6-й Aug ' 12: Objective-C эволюционировал с тех пор, как был написан этот ответ:
ivars
может быть объявлено в расширении класса (и всегда может быть - ответ был неправильным)@synthesize
не требуетсяivars
теперь можно объявить в скобках в верхней части@implementation
:то есть
@implementation { id _ivarInImplmentation; } //methods @end
концепция заключается в том, что вы можете сделать свой проект намного чище, если вы ограничьте себя .h для открытых интерфейсов вашего класса, а затем положить подробности частной реализации в этом расширении класса.
при объявлении переменных методов или свойств в ABC.H-файл , он означает, что эти переменные свойства и методы могут быть доступны за пределами класс
@interface Jain:NSObject { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)jain; @end
@интерфейс позволяет объявлять частные ивары, свойства и методы. Так все, что вы объявите здесь, не может быть доступно извне этот класс. В общем, вы хотите объявить все ivars, свойства и методы по умолчанию как частные
просто скажите, когда вы объявляете переменные методы или свойства в ABC.м файл , это означает, что эти переменные, свойства и методы не могут быть доступ вне класса
@interface Jain() { NSString *_name; } @property(readwrite, copy) NSString *name; -(NSString*)makeSmallTalkWith:(Person*)jain; @end