1、Objective-C中的內(nèi)存分布
對(duì)象類(lèi)型內(nèi)存分布在堆里面懦窘,是直接管理內(nèi)存前翎。
指針類(lèi)型分布在棧里面系統(tǒng)幫我們管理內(nèi)存。
不含*的變量畅涂,可能會(huì)使用椄刍空間。結(jié)構(gòu)體保存非對(duì)象類(lèi)型午衰。
2立宜、在類(lèi)的頭文件里面盡量少的引用其他頭文件
盡量使用“向前申明(@class
)”在頭文件引用該類(lèi),在.m文件才真正引用臊岸。
盡可能的避免兩個(gè)類(lèi)相互引用橙数。
如果一個(gè)協(xié)議多個(gè)地方使用的話盡可能的把協(xié)議單獨(dú)寫(xiě)成一個(gè)文件。
3帅戒、多用字面量灯帮,少用等價(jià)方法
字面量能在使用的時(shí)候盡早發(fā)現(xiàn)問(wèn)題。例如
NSString *a = @"a";
NSString *b = nil;
NSString *c = @"c";
//崩潰
NSArray *stringArray = @[a,b,c];
//不會(huì)崩潰
NSArray *stringArray1 = [NSArray arrayWithObjects:a,b,c,nil];
字面量能方便的實(shí)現(xiàn)數(shù)據(jù)的初始化逻住。例如
NSNumber *num1 = @1;
NSNumber *num2 = @2.1;
NSNumber *num3 = @YES;
字面量創(chuàng)建出來(lái)的對(duì)象都是不可變的如果需要可變的話必須復(fù)制一份mutableCopy
钟哥,當(dāng)然這樣就又會(huì)創(chuàng)建一個(gè)新的新的對(duì)象。
4瞎访、多用類(lèi)型常量腻贰,少用#define預(yù)處理指令
常量命名如果只是該文件內(nèi)部使用一般使用k開(kāi)頭,如果外部需要使用一般以該類(lèi)名開(kāi)頭扒秸。
申明常量的時(shí)候一般是static
和const
一起使用播演。const
保證常量不能被修改,否則編譯器會(huì)報(bào)錯(cuò)伴奥。static
修飾意味著該常量只能在該編譯單元可見(jiàn)写烤。如果不加static
編譯的時(shí)候就會(huì)生成一個(gè)“外部符號(hào)”,當(dāng)在其他地方申明同一個(gè)常量名的時(shí)候就會(huì)報(bào)錯(cuò)拾徙。
在頭文件使用extern來(lái)申明全局常量洲炊。例如
.m
NSString *const ViewControllerName = @"ViewControllerName";
.h
extern NSString *const ViewControllerName;
5、多用枚舉表示狀態(tài)锣吼、選項(xiàng)
盡可能多的使用NS_ENUM和NS_OPTIONS來(lái)定義枚舉选浑,以保證更好的向后兼容。
多選枚舉玄叠。
typedef NS_OPTIONS(NSInteger, MyOptions){
NOT = 0,
A = 1 << 0,
B = 1 << 1,
C = 1 << 2,
D = 1 << 3
};
//使用
MyOptions test = A | B | C;
if (test & A) {
NSLog(@"A");
}
if (test & B) {
NSLog(@"B");
}
if (test & C) {
NSLog(@"C");
}
6古徒、"屬性"
使用@property
來(lái)定義對(duì)象中所封裝的數(shù)據(jù)。
使用@dynamic
來(lái)阻止對(duì)象生成set和get方法读恃。
assign
修飾純值隧膘;strong
修飾對(duì)象代态,先保留新值,釋放舊值疹吃,把新值賦值上去蹦疑;weak
不保留新值,不保留舊值萨驶,當(dāng)對(duì)象釋放的時(shí)候自動(dòng)置為nil歉摧;copy
不保留新值,而是copy一份新值腔呜。
7叁温、對(duì)象內(nèi)部盡量直接訪問(wèn)實(shí)例變量
對(duì)象內(nèi)部設(shè)置屬性時(shí)盡量使用set方法,讀取直接實(shí)例變量核畴。
init和dealloc方法中盡量使用直接訪問(wèn)的形式進(jìn)行賦值膝但。
懶加載必須走get方法才能初始化。
8谤草、對(duì)象的對(duì)等性
==
比較的是兩個(gè)對(duì)象的指針跟束。
兩個(gè)對(duì)象進(jìn)行對(duì)比一般使用對(duì)象提供的isEqual
,如isEqualToString
。
兩個(gè)對(duì)象的hash
如果相等丑孩,但是兩個(gè)對(duì)象有可能還是不相等冀宴。
重寫(xiě)hash
方式的時(shí)候注意效率問(wèn)題。
9嚎杨、“類(lèi)族模式”隱藏實(shí)現(xiàn)細(xì)節(jié)
提供一套簡(jiǎn)單的公共接口給用戶(hù)使用花鹅,隱藏實(shí)現(xiàn)的細(xì)節(jié)氧腰,在公共接口標(biāo)明子類(lèi)需要復(fù)習(xí)的方法枫浙。
在UIKit框架中UIButton使用了該方式。
10古拴、在已有內(nèi)通過(guò)關(guān)聯(lián)對(duì)象存儲(chǔ)自定義數(shù)據(jù)
runtime對(duì)象關(guān)聯(lián)自定義數(shù)據(jù)
//設(shè)置對(duì)象關(guān)聯(lián)自定義數(shù)據(jù)
//關(guān)聯(lián)對(duì)象箩帚,key,需要關(guān)聯(lián)的值黄痪,內(nèi)存管理修飾
objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>)
//獲取關(guān)聯(lián)對(duì)象key存儲(chǔ)的值
//關(guān)聯(lián)對(duì)象紧帕,key
objc_getAssociatedObject(<#id object#>, <#const void *key#>)
//移除對(duì)象所有關(guān)聯(lián)的數(shù)據(jù)
//關(guān)聯(lián)對(duì)象
objc_removeAssociatedObjects(<#id object#>)
關(guān)聯(lián)對(duì)象內(nèi)存修飾
//assign
OBJC_ASSOCIATION_ASSIGN
//nonatomic,retain
OBJC_ASSOCIATION_RETAIN_NONATOMIC
//nonatomic,copy
OBJC_ASSOCIATION_COPY_NONATOMIC
//retain
OBJC_ASSOCIATION_RETAIN
//copy
OBJC_ASSOCIATION_COPY
通過(guò)runtime的這種對(duì)象關(guān)聯(lián)自定義屬性也能實(shí)現(xiàn)給category添加屬性。
最后編輯于 :2017.12.08 04:52:16
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者