淺復(fù)制和深復(fù)制的區(qū)別?
淺復(fù)制:只復(fù)制指向?qū)ο蟮闹羔槪粡?fù)制引用對(duì)象本身。
深復(fù)制:復(fù)制引用對(duì)象本身。
意思就是說(shuō)我有個(gè)A對(duì)象,復(fù)制一份后得到A_copy對(duì)象后,對(duì)于淺復(fù)制來(lái)說(shuō),A和A_copy指向的是同一個(gè)內(nèi)存資源,復(fù)制的只不個(gè)是一個(gè)指針,對(duì)象本身資源還是只有一份,那如果我們對(duì)A_copy執(zhí)行了修改操作,那么發(fā)現(xiàn)A引用的對(duì)象同樣被修改了,這其實(shí)違背了我們復(fù)制拷貝的一個(gè)思想。深復(fù)制就好理解了,內(nèi)存中存在了兩份獨(dú)立對(duì)象本身。
用通俗的話就是:
淺復(fù)制好比你和你的影子,你完蛋,你的影子也完蛋
深復(fù)制好比你和你的克隆人,你完蛋,你的克隆人還活著。
類別的作用?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?
category可以在不獲悉,不改變?cè)瓉?lái)代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。
并且如果類別和原來(lái)類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來(lái)的方法,因?yàn)轭悇e具有更高的優(yōu)先級(jí)。
類別主要有3個(gè)作用:
(1)將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中。
(2)創(chuàng)建對(duì)私有方法的前向引用
(3)向?qū)ο筇砑臃终絽f(xié)議。繼承可以增加,修改或者刪除方法,并且可以增加屬性。
類別和類擴(kuò)展的區(qū)別:
category和extensions的不同在于 后者可以添加屬性。另外后者添加的方法是必須要實(shí)現(xiàn)的。
extensions可以認(rèn)為是一個(gè)私有的category。
objective-c的類可以多重繼承嗎?可以實(shí)現(xiàn)多個(gè)接口嗎?category是什么?重寫一個(gè)類的方式用繼承好還是分類好?為什么?
objective-c的類不可以多重繼承;可以實(shí)現(xiàn)多個(gè)接口,多繼承在這里是用protocol委托代理來(lái)實(shí)現(xiàn)的,通過(guò)實(shí)現(xiàn)多個(gè)接口可以完成C++的多重繼承;category是類別,用category去重寫類的方法,僅對(duì)本category有效,不會(huì)影響到其他類與原有類的關(guān)系。
#import跟#include有什么區(qū)別,@class呢,#import<>跟#import”"又什么區(qū)別?
#import是objective-c導(dǎo)入頭文件的關(guān)鍵字,#include是C/C++導(dǎo)入頭文件的關(guān)鍵字,使用#import頭文件會(huì)自動(dòng)只導(dǎo)入一次,不會(huì)重復(fù)導(dǎo)入,相當(dāng)于#include和#pragma once;@class告訴編譯器某個(gè)類的聲明,當(dāng)執(zhí)行時(shí),才去查看類的實(shí)現(xiàn)文件,可以解決頭文件的相互包含;#import<>用來(lái)包含系統(tǒng)的頭文件,#import""用來(lái)包含用戶頭文件。
寫一個(gè)setter方法用于完成@property(nonatomic,retain) NSString *name,
寫一個(gè)setter方法用于完成@property(nonatomic,copy) NSString *name;
-(void)setName:(NSString *) str
{
[str ?retain];
[name ?release];
name ?= ?str;
}
-(void)setName:(NSString *) str
{ ?
id ?t ?= ?[str ?copy];
[name ?release];
name = t;
}