【GeekBand】objective-c basic1

  • 類與對象
  • 數(shù)據(jù)成員
  • 函數(shù)成員

TODO:

  • 初始化器和析構器
  • 繼承
  • 多態(tài)

類與對象

Objective-C(以下簡稱OC) 是一種面向對象語言超凳,因此除了基本數(shù)據(jù)類型万栅,它具有類類型所禀。OC 中類的聲明形式類似:

 @interface MyClass: NSObject
 {
  NSString* private;  //實例變量
  @public NSString* public; //實例變量
 }
 @property int num;  //屬性
 
 -(void)ObjectMethod: (int)num; //對象方法劲室,又叫實例方法
 +(void)ClassMethod; //類方法
 
 -(NSString*)private ;
 -(void)setPrivate: (NSString*)str;
 
 @end

OC 用 @interface 聲明類幕帆,相當于C++語法中的class關鍵字侮繁。@end表示聲明的結束虑粥。OC中的大部分中大部分類都會直接或者間接繼承自NSObject,這是因為NSObject中定義了一些OC對象通用的方法宪哩,比如定義一個類時[[MyClass alloc] init]娩贷,其中allocinit方法就是在NSObject中定義的,否則我們就要在類定義中自己實現(xiàn)這兩個方法锁孟。

OC中類的聲明放在.h文件彬祖,類是現(xiàn)實存在.m文件茁瘦。上面聲明的類其實現(xiàn)類似:

 @implement MyClass
 
 -(void)ObjectMethod: (int)num
 {
  self.num = num;
 }
 
 +(void)ClassMethod 
 {
  NSLog(@"This ClassMethod");
 }
 
 -(NSString*)private {
  return private;
 }
 
 -(void)setPrivate: (NSString*)str {
  private = str
 }

定義一個類對象的語法如下:

 MyClass* myClass = [[MyClass alloc] init]

大概是因為OC中的類對象都是分配在堆上的,所以储笑,類對象都聲明為指針的形式甜熔。

數(shù)據(jù)成員:屬性和實例變量

上述類聲明中的有一個數(shù)據(jù)成員,就是

@property in num;

屬性的存取方式

myClass.num = 5;
int someNum = myClass.num;

對于任何屬性突倍,編譯器都會自動生成一個與之關聯(lián)的實例變量腔稀。比如與num關聯(lián)的實例變量是_num。同時還生成一個getter訪問器方法和一個setter訪問器方法羽历。

-(int)num {
 return _num;
}

-(void)setNum: (int)num {
 _num = num;
}

可以發(fā)現(xiàn)這里的_num和它的兩個訪問器和我們在MyClass實現(xiàn)中定義的NSString* private;形式是類似的烧颖。
privatepublic一樣是實例變量,不同的是窄陡,一般的實例變量(如:private)只能在類的內部訪問炕淮,都是私有的。為了能在類的外部訪問(如myClass->public = @"hello";)跳夭,需要在實例變量聲明語句加上@public前綴(如:public)涂圆。
雖然private不能在外部通過->來訪問,但因為我們?yōu)?code>private編寫了getter訪問器和setter訪問器币叹,在OC中润歉,我們就可以使用myClass.private = @"world"這樣的語法來訪問private,其實編譯器會自動將該語句轉化成[myClass setPrivate:@"world"]颈抚,也就是實際是調用setter方法來訪問private實例變量的踩衩。
可想而知,如果沒有屬性贩汉,那么對于每個我們希望通過myClass.XXX形式來訪問的實例變量驱富,我們都需要為其編寫兩個訪問器方法,這實在是太過繁瑣匹舞。有了屬性這個語法糖褐鸥,就可以讓編譯器自動為我們完成這些工作了。
同樣赐稽,有了屬性叫榕,我們也不需要再使用@public關鍵字,通過->指針訪問符來訪問實例變量了姊舵。

需要注意的時晰绎,對于在.h.m文件中分別編寫類聲明和類實現(xiàn)代碼情況,即我們通常所遵循的方式括丁。外部使用時通過#import "xxx.h"只能知道xxx.h文件中的定義荞下,如果我們將某個實例變量定義在xxx.m的實現(xiàn)代碼中,那么就是為該實例變量加上@public前綴,外部對象也不能訪問該實例變量锄弱,因為它根本不知道該實例變量的存在。這點對于方法也是成立的祸憋,盡管方法都是public的会宪,但如果方法只在.m文件中定義,沒有在.h文件中聲明蚯窥,那么對于外部對象該方法就相當于是私有的掸鹅。相當于私有并不等于私有,這點在編譯器報錯時可以體現(xiàn)拦赠。只定義在.m文件中情況巍沙,訪問時編譯器會提示沒有定義該實例變量或者方法,而如果是聲明在.h文件中非@public實例變量荷鼠,訪問時編譯器會提示該實例變量是受保護的句携。

函數(shù)成員:方法

OC中的方法都是public的,沒有 private 和 protected 方法允乐。
OC中類的方法分為實例方法類方法矮嫉,聲明形式如下

-(void)ObjectMethod: (int)num; //對象方法,又叫實例方法
+(void)ClassMethod; //類方法

在語法層面牍疏,實例方法就是通過實例對象來調用的方法蠢笋,如[myClass ObjectMethod:10],定義時在方法名前加-前綴鳞陨;類方法就是通過類名來調用的方法昨寞,如[MyClass ClassMethod],定義時在方法名前加+前綴厦滤。
[[MyClass alloc] init]援岩,其中alloc就是類方法,init就是實例方法掏导。

類方法中是不能訪問本類的實例成員的窄俏。在邏輯上類方法可以在類對象不存在時調用,此時實例變量都還不存在碘菜,那么通過類方法訪問實例成員必然出錯凹蜈。即使類對象存在,假設有多個類對象忍啸,那么類方法是訪問那個類對象的實例成員也是無法確定仰坦。在實現(xiàn)上,編譯器會為實例方法自動添加指向當前對象的self指針參數(shù)计雌,通過self就能確定所訪問的對象悄晃。而類方法是沒有self參數(shù)的,所以類方法無法確定是哪個類對象。

OC中方法的外部參數(shù)名不同妈橄,就是不同的方法庶近。因此可以寫方法名相同,參數(shù)類型和數(shù)量相同眷蚓,以及返回值相同的鼻种,只有外部參數(shù)名不同的多個方法。

-(void)sum: (int)arg1 arg2: (int)arg2;
-(void)sum:(int)arg1 secondArg: (int)arg2;

這樣的兩個方法是可以同時存在的沙热。

初始化器和析構器

初始化器

    MyClass* myClass = [[MyClass alloc] init]

OC中創(chuàng)建一個對象需要配合使用allocinit兩個方法叉钥。正如方法名的字面意思,alloc方法用于分配對象空間篙贸,init方法用于對對象的實例變量進行初始化操作投队。
alloc方法在NSObject中已經定義,這也是我們的類要繼承于NSObject的原因之一爵川。alloc方法會將分配的內存空間用0來填充敷鸦,這樣所有的實例變量的值就會是0或者nil。
init的方法中寝贡,會先調用父類的init方法轧膘,再初始化自己的實例變量。
init是對象初始化器兔甘,在調用init之前還會調用一個類初始化器initialize谎碍。

@implementation MyClass 
...
-(id)init {
    self = [super init];
    NSLog(@"this init");
    return self;
}

+(void)initialize {
    if self == [MyClass class] {
        NSLog(@"this is initialize");
    }
}
...
@end

在類定義中實現(xiàn)這兩個初始化器,然后調用MyClass* myClass = [[MyClass alloc] init]
會輸出如下結果:

結果

類型初始化器initialize只能有一個洞焙,而對象初始化器init可以有多個蟆淀。

- (id)init;
- (id)initWithName: (NSString*)name;
- (id)initWithLocation: (NSPoint*)location;

在初始化器中,要使用實例變量澡匪,不要使用屬性熔任。

析構器 dealloc

在析構器中,主要做三件事

  1. ARC對對象屬性的引用計數(shù)器減1唁情,這個造作是自動完成疑苔。
  2. 手動釋放我們自己分配的動態(tài)內存
  3. 關閉非內存資源,比如文件句柄甸鸟,socket連接等
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末惦费,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抢韭,更是在濱河造成了極大的恐慌薪贫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刻恭,死亡現(xiàn)場離奇詭異瞧省,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門鞍匾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來交洗,“玉大人,你說我怎么就攤上這事橡淑」谷” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵梳码,是天一觀的道長隐圾。 經常有香客問我伍掀,道長掰茶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任蜜笤,我火速辦了婚禮濒蒋,結果婚禮上,老公的妹妹穿的比我還像新娘把兔。我一直安慰自己沪伙,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布县好。 她就那樣靜靜地躺著围橡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缕贡。 梳的紋絲不亂的頭發(fā)上翁授,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音晾咪,去河邊找鬼收擦。 笑死,一個胖子當著我的面吹牛谍倦,可吹牛的內容都是我干的塞赂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼昼蛀,長吁一口氣:“原來是場噩夢啊……” “哼宴猾!你這毒婦竟也來了?” 一聲冷哼從身側響起叼旋,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤鳍置,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后送淆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體税产,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了辟拷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撞羽。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衫冻,靈堂內的尸體忽然破棺而出诀紊,到底是詐尸還是另有隱情,我是刑警寧澤隅俘,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布邻奠,位于F島的核電站,受9級特大地震影響为居,放射性物質發(fā)生泄漏碌宴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一蒙畴、第九天 我趴在偏房一處隱蔽的房頂上張望贰镣。 院中可真熱鬧,春花似錦膳凝、人聲如沸碑隆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽上煤。三九已至,卻和暖如春著淆,著一層夾襖步出監(jiān)牢的瞬間劫狠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工牧抽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘉熊,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓扬舒,卻偏偏與公主長得像阐肤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讲坎,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容