Разница между определением @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 сложилось с момента написания этого ответа:

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

    @implementation {    id _ivarInImplmentation; } // методы @end

Ответ 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