@interface...@end :可以理解為相當(dāng)于c++中類的變量和方法的聲明
@implementation...@end :可以理解為相當(dāng)于c++中類的方法的實(shí)現(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
在一些代碼中 會(huì)遇到一些關(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
主要想扒一下兩個(gè)問(wèn)題:
1.為什么.h文件和.m文件里各有1個(gè)@interface?它們分別有什么用??
2.為什么name要定義兩遍
.h文件和.m文件里@interface...@end它們分別有什么用??
.h文件中的@interface 就是典型的頭文件,是供其他的class調(diào)用的,為外界暴露property和functions;
.m中的@interface ...@end在oc里是這樣的:

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