2010-10-19 7 views
72

Обычно мы используемразница между определением @interface в .h и .m файл

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

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

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

также дать несколько слов о добытчиками и сеттеров для файла интерфейса, который определен в файле .m ...

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

ответ

58

Распространено поставить поставить дополнительную @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-файле - это категория, которую вы не можете определить в ней.

Update 6 августа '12: Objective-C развивалась так как этот ответ был написан:

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

т шляпа,

@implementation { 
    id _ivarInImplmentation; 
} 
//methods 
@end 
+4

Малый Sidenote, фактически не положить что-нибудь в скобках, когда вы объявляете частный интерфейс. В противном случае он просто создает категорию, и вы этого не хотите. '@interface Person()' будет достаточно. –

+0

Спасибо, я не заметил этого. Я обновил свой ответ. –

+4

Если людям интересно узнать больше о категориях .. эта [страница] (http://macdevelopertips.com/objective-c/objective-c-categories.html) была очень полезной для меня. – Tim

0

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

3

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

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

@interface Jain:NSObject 
{ 
    NSString *_name; 
} 

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

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

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

@interface Jain() 
    { 
     NSString *_name; 
    } 

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