Разница между определением @interface в .h и .m файле - PullRequest
79 голосов
/ 19 октября 2010

Обычно мы используем

@interface interface_name : parent_class <delegates>
{
......
}
@end 
Метод

в файле .h и в файле .m мы синтезируем свойства переменных, объявленных в файле .h.

Но в некотором коде этот метод @interface ..... @ end также хранится в файле .m. Что это значит? В чем разница между ними?

Также приведите несколько слов о методах получения и установки для файла интерфейса, определенного в файле .m ...

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

Ответы [ 3 ]

62 голосов
/ 19 октября 2010

Обычно добавляется дополнительный @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's your day?";
}


-(void)startThinkOfWhatToHaveForDinner
{

}

@end

«Закрытая категория» (собственное имя для безымянной категории - не «Закрытая категория», а «Расширение класса») .m не позволяет компилятору предупреждать, что методы определены. Однако, поскольку @interface в файле .m является категорией, вы не можете определить в нем ivars.

Обновление от 6 августа '12: Objective-C эволюционировал с момента написания этого ответа:

  • ivars может быть объявлено в расширении класса (и всегда может быть - ответ неверен)
  • @synthesize не требуется
  • ivars теперь может быть объявлено в скобках вверху @implementation:

то есть

@implementation { 
     id _ivarInImplmentation;
}
//methods
@end
9 голосов
/ 01 апреля 2017

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

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

@interface Jain:NSObject
{
    NSString *_name;
}

@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)jain;
@end

@ Интерфейс позволяет объявлять частные ивары, свойства и методы. Таким образом, все, что вы заявляете здесь, не может быть доступно извне этот класс. В общем, вы хотите объявить все ivars, свойства и методы по умолчанию как частные

Просто скажите, когда вы объявляете переменные методы или свойства в ABC.m файл, это означает, что эти переменные свойства и методы не могут быть доступ вне класса

@interface Jain()
    {
        NSString *_name;
    }

    @property(readwrite, copy) NSString *name;
    -(NSString*)makeSmallTalkWith:(Person*)jain;
    @end
0 голосов
/ 09 декабря 2016

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

...