1绷耍,了解oc 語言的起源
1吐限,oc 是c語言添加了面向對象特性,是其超集褂始。oc 使用動態(tài)綁定的消息結構诸典,也就是說,在運行時才會檢查對象類型崎苗。接受一條消息后狐粱,究竟應執(zhí)行何種代碼,由運行環(huán)境而非編譯器決定
2胆数,理解c語言的核心概念肌蜻,有助于寫好oc程序,尤其要掌握內存模型和指針
2必尼,在類的頭文件中盡量少引用其他頭文件
1蒋搜,除非確有必要,否則不要引入頭文件。一般來說豆挽,應在某個類的頭文件中使用‘向前聲明’來提及別的類酸休,并在實現(xiàn)文件中引入那些類的頭文件。這樣做可以盡量降低類之間的耦合祷杈。
2斑司, 有時無法使用‘向前聲明’, 比如要聲明某個類遵循一項協(xié)議但汞。這樣宿刮,盡量把 ‘該類遵循的某協(xié)議’ 的這條聲明移動到分類中,如果不行私蕾,就把協(xié)議單獨放在一個頭文件中僵缺,然后將其引入。
@class Student;
3踩叭,多用字面量語法磕潮,少用與之等價的方法
1, 應該使用字面量語法來創(chuàng)建字符串容贝、數值自脯、數組、字典斤富。與創(chuàng)建此類對象的常規(guī)方法相比膏潮,這么做更加的簡明扼要。
NSNumber *num = @0;
NSString *str = @"1234";
NSArray *arr = @[ @1, @"2123", @[] ];
NSMutableArray *mArr =[@[]mutableCopy];
NSDictionary*dic = @{@"1":@"12"};
NSObject*ob = arr[1];
NSObject*ob = dic[@"1233"];
這種 使用 @XX ?的方法满力,也叫作焕参,標簽指針,
如果是 NSString *str = @"1234232";
系統(tǒng)會盡可能把NSString是實現(xiàn)為單例對象油额。并且叠纷,上面的例子,還是個編譯器常量潦嘶,就沒有創(chuàng)建NSString對象
2涩嚣,用字面量語法創(chuàng)建數組或者字典是,若值中有nil衬以,則活拋出異常缓艳。因此,務必確保值里不含nil
4看峻,多用類型常量阶淘,少用 #define 預處理指令
1,不使用預處理指令定義常量互妓。這樣定義出來的常量不含類型信息溪窒,編譯器只是會在編譯前據此執(zhí)行查找和替換操作坤塞。及時有人重新定義了常量值,編譯器也不會產生警告信心澈蚌,這將導致應用長程序中的常量值不一致摹芙。
2, 在實現(xiàn)文件中使用 static const 來定義 ‘ 只在編譯單元內可見的常量 ’宛瞄。由于此類常量不在全局符號表中浮禾,所以無需為其名稱加前綴
-- > 在一個類中 ?最上面的引用 #import 下面 ?定義本類的靜態(tài)常量,應該使用 ?statci const 定義并賦值份汗,
例如:
static const int abc = 1;
如果需要在其他類中使用(需要引用這個類的頭文件)盈电, 需要使用 extern
并且需要在名稱前加上這個類的名字作為前綴,防止和其他類混淆
例如
在.h中聲明
extern NSString * const SceneTest2Msg;
extern int const SceneTest2Value;
在.m中定義并賦值
NSString * const ?SceneTest2Msg = @"123";
int const?SceneTest2Value = 1;
注意, const的位置杯活,常量是個指針匆帚,所以const 修飾名字
3,在頭文件中使用 extern 來聲明全局常量旁钧,并在相關文件中定義其值吸重。中中常量要出現(xiàn)在全局符號表中,所以其名稱應加以區(qū)隔歪今,通常用與之相關的類名做前綴
5嚎幸,用枚舉表示狀態(tài)、選項彤委、狀態(tài)碼
1,應該使用枚舉來表示狀態(tài)機的狀態(tài)鞭铆、傳遞給方法的現(xiàn)在呢以及狀態(tài)嗎等值,給這些值起個易懂的名字
typedef enum{
PhotosAccess = 1,
CameraAccess,
MicrophoneAccess
} AccessType;
2焦影,如果把傳遞給某個方法的選項表示為枚舉類型,而多個選項又可以同時使用封断,那么就想各選項定義為2的冪斯辰,以便通過按位或操作將其組合起來
typedef enum{
ViewStatueA ??????????? = 0,
ViewStatueB ??????????? = 1 << 0,
ViewStatueC ??????????? = 1 << 1,
ViewStatueD ??????????? = 1 << 2,
} ViewStatue;
self.valuestatue=ViewStatueA | ViewStatueB;
3,用 NS_ENUM 與 NS_OPTIONS宏來定義枚舉類型坡疼,并指明其底層數據類型彬呻。這樣做可以確保是用開發(fā)者所選的數據類型實現(xiàn)出來,而不會采用編譯器所選的類型
typedef NS_ENUM(NSUInteger, ConnectStatue) {
ConnectStatueDisconnected,
ConnectStatueConnecting,
ConnectStatueConnected,
};
typedef NS_OPTIONS(NSUInteger, AlignStatue) {
AlignStatueLeft ? ? ? ? ? = 0,
AlignStatueMiddle ????? = 1 << 0,
AlignStatueRight ? ? ? ? ?= 1 << 1,
};
4柄瑰, 在處理枚舉類型的switch語句中不用實現(xiàn)default分支闸氮。這樣的話,加入新枚舉之后教沾,編譯器就會提示開發(fā)者:switch語句并未處理所有枚舉
--- 》 ?刪除default 分支