@interface...@end :可以理解為相當于c++中類的變量和方法的聲明
@implementation...@end :可以理解為相當于c++中類的方法的實現(xiàn)
oc.h中
@interface Person : NSObject
@property (nonatomic,copy)NSString *name;
@property (nonatomic,assign)NSInteger age;
- (void)fun;
@end
oc.m中
@implementation Person
- (void)fun {
? ? NSLog(@"(void)fun ");
}
@end
在一些代碼中 會遇到一些關(guān)于@interface別的寫法 例如下面這樣的
.h中
@interface Person : NSObject{
? ? NSString*_name;
}
@property (nonatomic,copy)NSString *name;
- (void)fun;
@end
.m中
@interface Person ()
@property (nonatomic,assign)NSInteger age;
@end
@implementation Person
- (void)fun {
? ? NSLog(@"(void)fun ");
}
@end
主要想扒一下兩個問題:
1.為什么.h文件和.m文件里各有1個@interface?它們分別有什么用??
2.為什么name要定義兩遍
.h文件和.m文件里@interface...@end它們分別有什么用??
.h文件中的@interface 就是典型的頭文件,是供其他的class調(diào)用的,為外界暴露property和functions;
.m中的@interface ...@end在oc里是這樣的:

就是我們常說的類的擴展,是.h文件中interface的補充,但是其變量不暴露出去,只能在.m可見,并且方法不必聲明,可以直接在@implementation...@end實現(xiàn)。比如對于上面的代碼,當別的class引用當前類的時候,我并不想讓別人知道我的age;
為什么name要定義兩遍
其實現(xiàn)在用的更多的是第一種寫法,幾乎已經(jīng)沒有人寫兩遍了,但是原理還是要理解一下:
嚴格來說@interface{}里定義的變量,叫作instance variable,它是這個Class內(nèi)部真正的全局變量,也就是我們常說的實例變量,但是這個變量并不對外公開,所以需要一個對外公開的方法來調(diào)用,即@property,作用就是告訴外界,我這個Class里,有這個變量的set/get方法,讓你調(diào)用來操作該變量。
升級之后,我們只需要聲明@property,系統(tǒng)回自動生成實例變量。
說到@property。還要說另外一個@synthesize,有些人會在聲明@property之后習(xí)慣性的在.m@synthesize一下,它是做什么呢,上面說到,當我們用@property的時候,相當于聲明set/get方法,那我們就需要在.m實現(xiàn)該方法,但是一個類里面常常不會說只有一個變量,也就不止一個set/get方法,手動實現(xiàn)太浪費時間,所以@synthesize在.m文件里自動生成了get/set方法。
當然,人越來越懶,Xcode4.4開始之后,編譯器會自己為每一個@property自動添加@synthesize,所以我們只需要寫@property就可以了。