Разница между определением @ interface in.h и.m-файл


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

@interface interface_name : parent_class <delegates>
{
......
}
@end 

метод in .файл H И в .M файл мы синтезируем свойства переменных, объявленных в .H-файл.

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

также дайте несколько слов о геттерах и сеттерах для файла интерфейса, который определен в .m-файл...

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

3 76

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

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