OC基礎(chǔ)

??OC是一種動態(tài)語言,不像其他語言的函數(shù)調(diào)用,而是有自己的一套消息發(fā)送的組件,Oc的重要工作依賴于Runtime(運行時)運行的,運行時應(yīng)該執(zhí)行的代碼由運行環(huán)境來決定.

??OC是C語言的超集.

??OC中創(chuàng)建的對象都存在于堆中,比如說我創(chuàng)建一個字符串對象NSString *string = @"Objective - C";這個行語句中,等號右邊是@"Objective - C"對象,會在堆中創(chuàng)建這個字符串對象擁有自己的一塊堆中的內(nèi)存地址,而等號左邊的string是被創(chuàng)建在棧中的一個指針,這個指針存儲的是右邊字符串對象的地址.32位的計算機,一個指針會占用4個字節(jié)的地址,64位計算機,一個指針會占用8個字節(jié)的地址.而如果我在創(chuàng)建NSString *newString = string;這樣只不過是又再棧中又創(chuàng)建一個指針,指向string指向的那塊字符創(chuàng)對象的地址,他們存儲的值是一樣的,但是這兩個指針的地址不一樣;

??在OC中類似于CGRect這樣的數(shù)據(jù)結(jié)構(gòu),本質(zhì)上就是C語言中的結(jié)構(gòu)體,他們也是創(chuàng)建在棧中的.

??在OC中也盡量在.h文件中不要過多的引入其它頭文件,如果條件允許的話,用@class來預(yù)先聲明這個對象,這叫做 向前聲明 .

??而在OC中應(yīng)該盡量使用字面量語法,就像是 NSString *string = @"wo";這樣的寫法,而不是NSString *string = [NSString stringWithFormat:@"wo"];這兩個寫法是等價的,但是在用上面的字面量語法能夠讓讀程序的人看程序更清晰,更重要的是,用字面量語法生成的源代碼更短

??以下是OC編譯后生成的底層代碼,第一行是NSString *string = @"wo";生成的,由此可見編譯效果用字面量語法更佳.

??而后面用對象方法生成的源代碼更長.

??后來我在實際中發(fā)現(xiàn)只是在NSString這個類型的數(shù)據(jù)會縮減源代碼,array,dict等等并不會縮短,反而源代碼會更長,這里說明OC底層是對string這個類型的對象做過一些內(nèi)存和代碼上的優(yōu)化的.

NSString *string = (NSString *)&__NSConstantStringImpl__var_folders_rx_l216t3ws3yv2b58z7dpkr8zr0000gn_T_main_eaaf03_mi_0;
NSString *string = ((NSString *(*)(id, SEL, NSString *, ...))(void *)objc_msgSend)((id)objc_getClass("NSString"), sel_registerName("stringWithFormat:"), (NSString *)&__NSConstantStringImpl__var_folders_rx_l216t3ws3yv2b58z7dpkr8zr0000gn_T_main_81564b_mi_0);
NSArray *arrayA = [NSArray arrayWithObject:@"wo"];
NSArray *arrayB = @[@"wo"];
//以下是生成的C++源代碼,可見用字面量語法的不一樣
NSArray *arrayA = ((NSArray *(*)(id, SEL, ObjectType))(void *)objc_msgSend)((id)objc_getClass("NSArray"), sel_registerName("arrayWithObject:"), (id)(NSString *)&__NSConstantStringImpl__var_folders_rx_l216t3ws3yv2b58z7dpkr8zr0000gn_T_main_7528cd_mi_0);
       
NSArray *arrayB = ((NSArray *(*)(id, SEL, const ObjectType *, NSUInteger))(void *)objc_msgSend)(objc_getClass("NSArray"), sel_registerName("arrayWithObjects:count:"), (const id *)__NSContainer_literal(1U, (NSString *)&__NSConstantStringImpl__var_folders_rx_l216t3ws3yv2b58z7dpkr8zr0000gn_T_main_7528cd_mi_1).arr, 1U);

這里關(guān)于OC數(shù)組再提及一下,

假設(shè)我現(xiàn)在有三個對象 obj1,obj2,obj3,obj4

NSArray *arrayA = [NSArray arrayWithObjects:obj1,obj2,obj3,obj4,nil];

NSArray *arrayB = @[obj1,obj2,obj3,obj4];

當(dāng)我的obj3 = nil;這時arrayB會拋出異常,但是arrayA并不會,但是結(jié)果有出入,
不是我們想要的結(jié)果他會在obj3時截止,不再包含obj4,
這時因為用這個arrayWithObjects:方法是用nil來識別數(shù)組對象是否截止,
這里如果我們是用字面量方法來創(chuàng)建的對象,我們就能直接更快的發(fā)現(xiàn)錯誤.所以說用字面量語法更加安全.

關(guān)于字典如果我們直接使用OC字典的方法創(chuàng)建字典,我們會發(fā)現(xiàn)我們所理解的{<鍵>:<值>}在這里是反著的,我們在寫代碼的時候是先寫值,在寫鍵,我感覺是有點反人類的,但是如果我們是用字面量語法的話,會發(fā)現(xiàn)這整個世界都正常了.

并且和數(shù)組一樣,一旦我們的值是nil,字面量語法創(chuàng)建的話,就會立即拋出異常,但是如果是使用對象方法創(chuàng)建的話就會在這里停止,不再包含之后的數(shù)據(jù).

OC中,"對象"就是"基本的構(gòu)造單元",我們開發(fā)時可以通過對象來存儲和傳遞數(shù)據(jù).在對象之間傳遞數(shù)據(jù)并且執(zhí)行任務(wù)的過程中就叫做"消息傳遞".在程序運行期間,為其提供相關(guān)支持的代碼叫做RunTime.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蔬螟,一起剝皮案震驚了整個濱河市之拨,隨后出現(xiàn)的幾起案子拇砰,更是在濱河造成了極大的恐慌诵棵,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坝锰,死亡現(xiàn)場離奇詭異糙申,居然都是意外死亡涨冀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門债沮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炼吴,“玉大人,你說我怎么就攤上這事疫衩」璞模” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵闷煤,是天一觀的道長童芹。 經(jīng)常有香客問我,道長鲤拿,這世上最難降的妖魔是什么假褪? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮近顷,結(jié)果婚禮上生音,老公的妹妹穿的比我還像新娘。我一直安慰自己幕庐,他們只是感情好久锥,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著异剥,像睡著了一般瑟由。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冤寿,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天歹苦,我揣著相機與錄音,去河邊找鬼督怜。 笑死殴瘦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的号杠。 我是一名探鬼主播蚪腋,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼丰歌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屉凯?” 一聲冷哼從身側(cè)響起立帖,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悠砚,沒想到半個月后晓勇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡灌旧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年绑咱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枢泰。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡描融,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宗苍,到底是詐尸還是另有隱情稼稿,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布讳窟,位于F島的核電站让歼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏丽啡。R本人自食惡果不足惜谋右,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望补箍。 院中可真熱鬧改执,春花似錦、人聲如沸坑雅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裹粤。三九已至终蒂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遥诉,已是汗流浹背拇泣。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留矮锈,地道東北人霉翔。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像苞笨,于是被迫代替她去往敵國和親债朵。 傳聞我的和親對象是個殘疾皇子子眶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • OC基礎(chǔ)總結(jié) 重新回過頭看這些基礎(chǔ)知識,對許多知識點都有新的認(rèn)識葱弟,擁有堅實的基礎(chǔ)才能更快的成長壹店。 #improt ...
    xx_cc閱讀 6,015評論 10 56
  • 又是一個新學(xué)期,又站在了講臺上射窒,又開始了新一輪講授藏杖。如果問我有什么不同,那就是我漸漸老去脉顿,學(xué)生一年比一年小蝌麸。還有責(zé)...
    鐵嫵閱讀 877評論 90 56
  • 真情暖,相思亂艾疟。奈何花落紅薔苑来吩。芍藥朵,風(fēng)姿綽蔽莱。萬紫千紅弟疆,舊顏芳若。陌盗冷、陌怠苔、陌。 紅塵短仪糖,離愁斷柑司。雁鴻歸去鄉(xiāng)書傳。...
    Delia常青藤閱讀 300評論 11 19
  • 天氣變化無常 注意保暖 照顧好自己的身體
    劉磊stely閱讀 301評論 0 0