二、對(duì)象篮撑、消息减细、runtime

6,理解 '屬性'這一概念

1赢笨, 可以用@property語(yǔ)法來(lái)定義對(duì)象中所封裝的數(shù)據(jù)未蝌。

2, 通過'特質(zhì)'來(lái)定義指定存儲(chǔ)數(shù)據(jù)所需的正確語(yǔ)義

原子性,

讀寫權(quán)限茧妒, 可以在分類中重新定義

內(nèi)存管理語(yǔ)義萧吠, 注意,NSString ?Block ?應(yīng)為 Copy

方法名

3桐筏, 在設(shè)置屬性所對(duì)應(yīng)的實(shí)例變量時(shí)纸型,一定要遵從該屬性所聲明的定義

4, 開發(fā)iOS程序時(shí)梅忌,應(yīng)該使用nonatomic屬性狰腌, 因?yàn)閍tomic屬性會(huì)嚴(yán)重影響性能。

如果使用

@dynamic 代替@synthesize

編譯器不會(huì)這個(gè)屬性自動(dòng)創(chuàng)建存取方法牧氮,和合并存取方法琼腔,并不會(huì)自動(dòng)創(chuàng)建實(shí)例變量。如果用代碼訪問其中的屬性踱葛,編譯器也不會(huì)發(fā)出警示信息

例如

@property (nonatomic,assign) intabc;

@dynamic abc;

這樣丹莲,如果用戶就不會(huì)創(chuàng)建 _abc 這個(gè)實(shí)例變量了

7,在對(duì)象內(nèi)部盡量直接訪問實(shí)例變量

1剖毯, 在對(duì)象內(nèi)部讀取數(shù)據(jù)時(shí)圾笨,應(yīng)該直接通過實(shí)例變量,而寫入數(shù)據(jù)時(shí)逊谋,應(yīng)該通過屬性

2擂达, 在初始化和delloc方法中,總是應(yīng)該通過實(shí)例變量來(lái)讀寫數(shù)據(jù)

3胶滋,有時(shí)會(huì)使用惰性初始化技術(shù)配置某份數(shù)據(jù)板鬓,這種情況下,需要同過屬性來(lái)讀取數(shù)據(jù)

8究恤,理解‘對(duì)象等同性’這一概念

1俭令,若想檢測(cè)對(duì)象的等同性,請(qǐng)?zhí)峁?‘isEqual’與hash 方法

2部宿, 相同的對(duì)象必須有相同的哈希碼抄腔,但是兩個(gè)哈希碼相同的對(duì)象未必相同

3瓢湃,不用盲目的逐個(gè)檢測(cè)每條屬性,而是應(yīng)該依照具體需求來(lái)指定檢測(cè)方案

4赫蛇, 編寫hash方法時(shí)绵患,應(yīng)該使用技術(shù)速度快而且哈希碼碰撞幾率低的算法

9,以’類族‘隱藏實(shí)現(xiàn)細(xì)節(jié)

1悟耘, 類族模式可以把實(shí)現(xiàn)細(xì)節(jié)隱藏在一套簡(jiǎn)單的公共接口后面

2落蝙, 系統(tǒng)框架中經(jīng)常使用類族

3,從類族的公共抽象類中集成子類時(shí)需要當(dāng)心暂幼,如果有開發(fā)文檔筏勒,則應(yīng)首先閱讀

---> 類族,就是常說的旺嬉,抽象類的靜態(tài)方法管行、類方法來(lái)創(chuàng)建實(shí)例對(duì)象

10,在既有類中使用關(guān)聯(lián)對(duì)象存放自定義數(shù)據(jù) ( 動(dòng)態(tài)添加屬性邪媳,相當(dāng)于給一個(gè)對(duì)象中粘貼了一個(gè)對(duì)象病瞳,并設(shè)置了相關(guān)的內(nèi)存管理寓意 )

1, 可以使用關(guān)聯(lián)對(duì)象機(jī)制來(lái)把兩個(gè)對(duì)象連起來(lái)

2悲酷, 定義關(guān)聯(lián)對(duì)象可指定內(nèi)存管理語(yǔ)義,用以模仿定義屬性時(shí)采用的 擁有關(guān)系 與 非擁有關(guān)系

3亲善, 只有在其他方法不可行時(shí)设易,才贏選用關(guān)聯(lián)對(duì)象,因?yàn)檫@種做法通常會(huì)引入難以查找的BUG

-- > 相當(dāng)于給一個(gè)物件 粘上一個(gè)物件蛹头, 內(nèi)存管理顿肺,應(yīng)該尊重內(nèi)存管理語(yǔ)義

引用

#import"objc/runtime.h"

全局

staticvoid*SceneTest4Key =@"SceneTest4Key";

-(void)test6

{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Question"message:@"What do you want to do ?"delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Continue",nil];

void(^block)(NSInteger) = ^(NSIntegerbuttonIndex){

if(buttonIndex == 0) {

[self doCancel];

}else{

[self doContinue];

}

};

objc_setAssociatedObject(alert,SceneTest4Key, block,OBJC_ASSOCIATION_COPY);

[alert show];

}

-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

void(^block)(NSInteger) =objc_getAssociatedObject(alertView,SceneTest4Key);

block(buttonIndex);

}


11,理解 objc_msgSend 的作用

1渣蜗, 消息由接受者屠尊、選擇子和參數(shù)構(gòu)成。給某對(duì)象'發(fā)送消息'也就是相當(dāng)于在該對(duì)象上調(diào)用方法

2耕拷,發(fā)給某對(duì)象的全部消息都要由 ‘動(dòng)態(tài)消息派發(fā)系統(tǒng)’來(lái)處理讼昆,該系統(tǒng)會(huì)查處對(duì)應(yīng)的方法,并執(zhí)行代碼


12骚烧,理解消息轉(zhuǎn)發(fā)機(jī)制

1浸赫, 若對(duì)象無(wú)法相應(yīng)某個(gè)選擇子,則進(jìn)入消息轉(zhuǎn)發(fā)流程

2赃绊,通過運(yùn)行期的動(dòng)態(tài)方法解析功能既峡,我們可以在需要用到某個(gè)方法時(shí)再將其加入到類中

3,對(duì)象可以把某個(gè)無(wú)法解讀的選擇子轉(zhuǎn)交給其他對(duì)象處理

4碧查,經(jīng)過上述兩步后运敢,若是還是沒辦法處理選擇子,那就啟動(dòng)完整的消息轉(zhuǎn)發(fā)機(jī)制


調(diào)用方法的流程

1,首先檢測(cè)對(duì)象的類有沒有實(shí)現(xiàn)這個(gè)方法传惠,有就調(diào)用迄沫,沒有繼續(xù)往下

2,向上檢測(cè)父類有沒有實(shí)現(xiàn)涉枫,直到根類?NSObject邢滑,如果都沒有實(shí)現(xiàn)就繼續(xù)往下

3,進(jìn)入轉(zhuǎn)發(fā)機(jī)制愿汰,以此往下

方案一:拯救1困后,檢測(cè)動(dòng)態(tài)添加

1

+?(BOOL)resolveInstanceMethod:(SEL)sel

1

+?(BOOL)resolveClassMethod:(SEL)sel

方案二:拯救2,檢測(cè)消息是否轉(zhuǎn)發(fā)

1

-?(id)forwardingTargetForSelector:(SEL)aSelector

方案三:拯救3衬廷,檢測(cè)用戶是否已經(jīng)注冊(cè)過摇予,可以注冊(cè)但不實(shí)現(xiàn)

1

-?(NSMethodSignature?*)methodSignatureForSelector:(SEL)aSelector;

1

-?(void)forwardInvocation:(NSInvocation?*)anInvocation;


13,用‘方法調(diào)配技術(shù)’調(diào)試‘黑盒方法’

1吗跋, 在運(yùn)行時(shí)侧戴,可以向類中新增和替換選擇子所對(duì)應(yīng)的方法實(shí)現(xiàn)

2,使用另一份實(shí)現(xiàn)來(lái)替換原有的方法實(shí)現(xiàn)跌宛,這道工序叫做酗宋,‘方法調(diào)配’,開發(fā)者常用此技術(shù)向原有實(shí)現(xiàn)中添加功能

3疆拘,一般來(lái)說蜕猫,只有調(diào)試程序的時(shí)候,才需要在運(yùn)行時(shí)修改方法實(shí)現(xiàn)哎迄,這種做法不易濫用

動(dòng)態(tài)的交換方法

示例:AFN 使用了動(dòng)態(tài)交換方法回右,交換了網(wǎng)絡(luò)獲取的方法,在網(wǎng)絡(luò)獲取的時(shí)候來(lái)發(fā)送通知


NSString*abc =@"NSString";

NSLog(@"大寫%@", [abcuppercaseString]);

NSLog(@"小寫%@", [abclowercaseString]);

MethodoriginalMethod =class_getInstanceMethod([NSStringclass],@selector(lowercaseString));

MethodswappedMethod =class_getInstanceMethod([NSStringclass],@selector(uppercaseString));

method_exchangeImplementations(originalMethod, swappedMethod);

NSLog(@"大寫%@", [abcuppercaseString]);

NSLog(@"小寫%@", [abclowercaseString]);

2016-05-01 12:10:54.239 EasyIOSDemo[3214:283447]大寫NSSTRING

2016-05-01 12:10:54.240 EasyIOSDemo[3214:283447]小寫nsstring

2016-05-01 12:10:54.241 EasyIOSDemo[3214:283447]大寫nsstring

2016-05-01 12:10:54.241 EasyIOSDemo[3214:283447]小寫NSSTRING

14漱挚,理解‘類對(duì)象’的用意

1翔烁, 每一個(gè)實(shí)例都有一個(gè)指向Class 對(duì)象的指針,用以表明其類型旨涝,而這些Class對(duì)象 則構(gòu)成了類的繼承體系蹬屹。 這個(gè)指針是 isa,對(duì)象指向類颊糜,類指向父類哩治,直至NSObject

和swift 存在差別,swift中的 isa 始終指向所屬的類

2衬鱼,如果對(duì)象類型無(wú)法在編譯期確定业筏,那么就應(yīng)該使用類型信息查詢方法類探知

3,盡量使用類型信息查詢方法類確定對(duì)象類型鸟赫,而不要使用直接比較類對(duì)象蒜胖,因?yàn)槟承?duì)象可能實(shí)現(xiàn)了消息轉(zhuǎn)發(fā)功能

NSMutableDictionary*dic = [NSMutableDictionarynew];

[dic isMemberOfClass:[NSDictionaryclass]];// NO

[dicisMemberOfClass:[NSMutableDictionaryclass]];// YES

[dic isKindOfClass:[NSDictionaryclass]];// YES

[dic isKindOfClass:[NSArrayclass]];// NO;

isMemberOfClass ?判斷對(duì)象是否是某個(gè)類的實(shí)例

isKindOfClass 盤對(duì)想想是否是某個(gè)類活其派生類的實(shí)例

----- > 類對(duì)象消别,[NSArrayclass]

NSMutableDictionary*dic = [NSMutableDictionarynew];

NSLog(@"%@, %@", [dicclass], [NSMutableDictionaryclass]);

NSDictionary*dic1 = [NSDictionarynew];

NSLog(@"%@, %@", [dic1class], [NSDictionaryclass]);

__NSDictionaryM, NSMutableDictionary

__NSDictionary0, NSDictionary

在AppDelegate中打印

NSLog(@"%@, %@", [super class], self.superclass);

顯示 [2146:51427] AppDelegate, UIResponder

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市台谢,隨后出現(xiàn)的幾起案子寻狂,更是在濱河造成了極大的恐慌,老刑警劉巖朋沮,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揣钦,死亡現(xiàn)場(chǎng)離奇詭異皿渗,居然都是意外死亡病袄,警方通過查閱死者的電腦和手機(jī)妥衣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)筋夏,“玉大人蒂胞,你說我怎么就攤上這事√跖瘢” “怎么了骗随?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)赴叹。 經(jīng)常有香客問我鸿染,道長(zhǎng),這世上最難降的妖魔是什么乞巧? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任牡昆,我火速辦了婚禮,結(jié)果婚禮上摊欠,老公的妹妹穿的比我還像新娘。我一直安慰自己柱宦,他們只是感情好些椒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掸刊,像睡著了一般免糕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忧侧,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天石窑,我揣著相機(jī)與錄音,去河邊找鬼蚓炬。 笑死松逊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肯夏。 我是一名探鬼主播经宏,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼犀暑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了烁兰?” 一聲冷哼從身側(cè)響起耐亏,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沪斟,沒想到半個(gè)月后广辰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡主之,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年择吊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杀餐。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡干发,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出史翘,到底是詐尸還是另有隱情枉长,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布琼讽,位于F島的核電站必峰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏钻蹬。R本人自食惡果不足惜吼蚁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望问欠。 院中可真熱鬧肝匆,春花似錦、人聲如沸顺献。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)注整。三九已至能曾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肿轨,已是汗流浹背寿冕。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留椒袍,地道東北人驼唱。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像驹暑,于是被迫代替她去往敵國(guó)和親曙蒸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捌治,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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