一、@interface部分
@interface部分用于定義類的公共接口(API)。
@interface Person : NSObject
在創(chuàng)建一個(gè)對(duì)象的時(shí)候OC編譯器需要一些關(guān)于該類的信息,尤其是對(duì)象的數(shù)據(jù)成員及其提供的功能。使用@interface指令把這些信息傳遞給編譯器。
在OC語言中只要只要看到@符號(hào),就可以把它看成是對(duì)C語言的擴(kuò)展,@interface Person就是告訴編譯器:“這是類Person的接口”
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
@interface后面的NSObject告訴編譯器,Person類是繼承自NSObject類的,即Person類繼承NSObject類定義的所有行為。
實(shí)例變量
@interface Person : NSObject后面的花括號(hào){ }告訴編譯器,括號(hào)里是我們?yōu)镻erson類定義的實(shí)例變量。
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
}
@end
如上定義了實(shí)例變量_name。
這樣定義實(shí)例變量(1)是局部的(2)不能用點(diǎn)語法調(diào)用。
局部變量就不用說了,只能本類里面使用,因?yàn)椴荒苁褂命c(diǎn)語法,在其他類也沒法調(diào)用。
為什么不能使用點(diǎn)語法呢?點(diǎn)語法的實(shí)質(zhì)是調(diào)用的set或get方法,這樣聲明的實(shí)例變量是沒有set和get方法的,所以不能用點(diǎn)語言,只能在類里面用_name。
如果我們寫了實(shí)例變量的set、get方法,則實(shí)例變量就能使用點(diǎn)語法了,那在類的外面也就能調(diào)用了,這時(shí)候這樣申明+set、get方法就不是局部變量了,如下:
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
{
NSString *_name;
}
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
Person.m
#import "Person.h"
@implementation Person
- (void)setName:(NSString *)name {
_name = name;
}
- (NSString *)name {
return _name;
}
@end
方法聲明
方法聲明里有方法的名稱、方法返回值、返回值類型和參數(shù)、參數(shù)類型等
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)run;
@end
- “-”短線表明這是OC方法的聲明,這是區(qū)分函數(shù)原型與方法聲明的一種方式,函數(shù)原型中沒有先行短線,如下:
void run(float kilometer){
printf("%f",kilometer);
}
這個(gè)函數(shù)返回值是void,即無返回值,傳入?yún)?shù)kilometer,然后打印。
- OC中命名方法的名稱及其參數(shù)都是合在一起使用的,這就是中綴符語法技術(shù),或者叫“中綴語法”。
- (void)singWithSong:(NSString *)song;
方法名的描述是sing,唱歌,前面的song是參數(shù)描述,最后的song是參數(shù)名。
中綴語法使得代碼的可讀性更強(qiáng),參數(shù)的用途更容易理解。
其實(shí)整個(gè)方法的名稱是singWithSong:,后面的冒號(hào)是名稱的一部分,它是告訴編譯器和其他閱讀人員后面出現(xiàn)的是參數(shù)。
參數(shù)的類型是在圓括號(hào)里指定的。
@end
@interface 開始一個(gè)類的聲明,@end該類的聲明結(jié)束。
二、@implementation部分
#import "Person.h"
@implementation Person
@end
@implementtation是一個(gè)編譯器指令,表明將要對(duì)該類提供實(shí)現(xiàn)代。
類名出現(xiàn)在@implementtation之后,該行的結(jié)尾處沒有“;”,因?yàn)镺C編譯器指令后不用 “ ;”。
在@implementtation里定義的那些頭文件里沒有的方法,只能在當(dāng)前類的實(shí)現(xiàn)文件中使用的私有方法。
@end實(shí)現(xiàn)文件結(jié)束編譯器指令。
有時(shí)候我們會(huì)看到在@implementtation上面自己加上@interface @end,如下:
#import "Person.h"
@interface Person ()
{
}
@end
@implementation Person
@end
這里的@interface和在頭文件里的有點(diǎn)像,但是還不全像,對(duì)比看一下:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
頭文件中
@interface 類名 : 父類名
@end
實(shí)現(xiàn)文件中
@interface 類名 ()
@end
兩者寫法不同有不同的含義,實(shí)質(zhì)上在實(shí)現(xiàn)文件中這樣的寫法就是我們通常所說的“擴(kuò)展”,其實(shí)它就是一個(gè)擴(kuò)展,實(shí)現(xiàn)文件中擴(kuò)展的屬性只能在該類實(shí)現(xiàn)文件中使用。