基礎(chǔ)
1. @property 后面可以有哪些修飾符账千?
- 原子性---
nonatomic
虾宇、atomic
在默認(rèn)情況下凤类,由編譯器合成的方法會(huì)通過鎖定機(jī)制確保其原子性(atomicity)扛稽。如果屬性具備 nonatomic 特質(zhì)柴灯,則不使用自旋鎖。請(qǐng)注意宣旱,盡管沒有名為“atomic”的特質(zhì)(如果某屬性不具備 nonatomic 特質(zhì)仅父,那它就是“原子的” ( atomic) ),但是仍然可以在屬性特質(zhì)中寫明這一點(diǎn)浑吟,編譯器不會(huì)報(bào)錯(cuò)笙纤。若是自己定義存取方法,那么就應(yīng)該遵從與屬性特質(zhì)相符的原子性买置。
讀/寫權(quán)限---
readwrite(讀寫)
粪糙、readonly (只讀)
實(shí)際上是決定是否生成setter、getter方法內(nèi)存管理語義---
assign
忿项、strong
蓉冈、weak
、unsafe_unretained
轩触、copy
assign
直接賦值寞酿,常用于修飾基礎(chǔ)類型,如int脱柱,bool伐弹。修飾對(duì)象時(shí),引用計(jì)數(shù)不會(huì)+1榨为,會(huì)造成野指針惨好。
weak
直接賦值煌茴,ARC下修飾對(duì)象使用,引用計(jì)數(shù)不會(huì)+1日川,對(duì)象銷毀時(shí)蔓腐,會(huì)指向nil,不會(huì)造成野指針龄句。
Runtime維護(hù)了一個(gè)weak表回论,用于存儲(chǔ)指向某個(gè)對(duì)象的所有weak指針。weak表其實(shí)是一個(gè)hash(哈希)表分歇,Key是所指對(duì)象的地址傀蓉,Value是weak指針的地址(這個(gè)地址的值是所指對(duì)象指針的地址)數(shù)組。當(dāng)此對(duì)象的引用計(jì)數(shù)為0的時(shí)候會(huì) dealloc职抡,假如 weak 指向的對(duì)象內(nèi)存地址是a葬燎,那么就會(huì)以a為鍵, 在這個(gè) weak 表中搜索缚甩,找到所有以a為鍵的 weak 對(duì)象萨蚕,從而設(shè)置為 nil。
strong
直接賦值并且對(duì)象的retain count +1蹄胰,一般用于修飾對(duì)象。
copy
不會(huì)增加對(duì)象的 retain count奕翔,而是會(huì)重新復(fù)制一份對(duì)象裕寨,然后將指針指向新復(fù)制的對(duì)象。
NSString派继、NSArray宾袜、NSDictionary使用copy修飾,因?yàn)樗麄儠?huì)對(duì)應(yīng)可變的NSMutableString驾窟、NSMutableArray庆猫、NSMutableDictionary。假如有一個(gè)屬性是NSString類型的绅络,但是我們卻將一個(gè)NSMutableString賦值給了它(這是合法的)月培,如果我們使用strong關(guān)鍵字,那么現(xiàn)在這個(gè)對(duì)象是一個(gè)NSMutableString的對(duì)象恩急,如果在別的地方修改了這個(gè)對(duì)象的值杉畜,那么該屬性也跟著變了,這可能會(huì)帶來意想不到的后果衷恭。但如果我們使用copy關(guān)鍵字的話此叠,就不會(huì)存在這個(gè)問題了,因?yàn)樗鼤?huì)拷貝一份NSMutableString的值随珠,這時(shí)屬性依然是 immutable 的灭袁,即使NSMutableString的對(duì)象修改了也不會(huì)影響屬性的值猬错。
a、 對(duì)非集合類對(duì)象的copy操作:
[immutableObject copy] // 淺復(fù)制
[immutableObject mutableCopy] //深復(fù)制
[mutableObject copy] //深復(fù)制
[mutableObject mutableCopy] //深復(fù)制
b茸歧、集合類對(duì)象的copy與mutableCopy
[immutableObject copy] // 淺復(fù)制
[immutableObject mutableCopy] //單層深復(fù)制
[mutableObject copy] //單層深復(fù)制
[mutableObject mutableCopy] //單層深復(fù)制
- 方法名---
getter=<name>
举娩、setter=<name>
2. 面向?qū)ο笕筇匦?/h5>
封裝析校,繼承,多態(tài)
3. 成員變量跟屬性
關(guān)系:屬性是對(duì)成員變量的封裝铜涉,即 property = ivar+setter+getter
4. @synthesize和@dynamic分別有什么作用智玻?
@property有兩個(gè)對(duì)應(yīng)的詞,一個(gè)是 @synthesize芙代,一個(gè)是 @dynamic吊奢。如果 @synthesize和 @dynamic都沒寫,那么默認(rèn)的就是@syntheszie var = _var;
@synthesize 的語義是如果你沒有手動(dòng)實(shí)現(xiàn) setter 方法和 getter 方法纹烹,那么編譯器會(huì)自動(dòng)為你加上這兩個(gè)方法页滚。
@dynamic 告訴編譯器:屬性的 setter 與 getter 方法由用戶自己實(shí)現(xiàn),不自動(dòng)生成铺呵。(當(dāng)然對(duì)于 readonly 的屬性只需提供 getter 即可)裹驰。假如一個(gè)屬性被聲明為 @dynamic var,然后你沒有提供 @setter方法和 @getter 方法片挂,編譯的時(shí)候沒問題幻林,但是當(dāng)程序運(yùn)行到 instance.var = someVar,由于缺 setter 方法會(huì)導(dǎo)致程序崩潰音念;或者當(dāng)運(yùn)行到 someVar = var 時(shí)沪饺,由于缺 getter 方法同樣會(huì)導(dǎo)致崩潰。編譯時(shí)沒問題闷愤,運(yùn)行時(shí)才執(zhí)行相應(yīng)的方法整葡,這就是所謂的動(dòng)態(tài)綁定。
5. 如何將class定義一個(gè)對(duì)外只讀對(duì)內(nèi)可讀寫的屬性
.h文件中讥脐,屬性用readonly修飾遭居,.m文件使用readwrite修飾
6. public、private攘烛、protected的作用域
public:不受限制魏滚,都可以訪問;
protected:除本身跟子類可訪問坟漱,其余外部類不可訪問鼠次;
private:只能本身內(nèi)部訪問。
外部可以通過“->”來訪問,對(duì)于private腥寇、protected成翩,可通過kvc或者runtime實(shí)現(xiàn)修改、訪問赦役。
7. Categroy的理解
- category的主要作用是為已經(jīng)存在的類添加方法
- 可以把類的實(shí)現(xiàn)分開在幾個(gè)不同的文件里面麻敌。這樣做有幾個(gè)顯而易見的好處,a)可以減少單個(gè)文件的體積 b)可以把不同的功能組織到不同的category里 c)可以由多個(gè)開發(fā)者共同完成一個(gè)類 d)可以按需加載想要的category 等等掂摔。
- 聲明私有方法
- 模擬多繼承
- 把framework的私有方法公開
category是無法添加實(shí)例變量的(因?yàn)樵谶\(yùn)行期术羔,對(duì)象的內(nèi)存布局已經(jīng)確定,如果添加實(shí)例變量就會(huì)破壞類的內(nèi)部布局乙漓,這對(duì)編譯型語言來說是災(zāi)難性的)级历。可以添加屬性叭披,但是只是聲明寥殖,具體的setter,getter方法還需要自己去實(shí)現(xiàn)涩蜘,并且是這樣實(shí)現(xiàn)setter:objc_setAssociatedObject嚼贡,getter:objc_getAssociatedObject。
8. oc對(duì)象的內(nèi)存布局
- 所有父類的成員變量和自己的成員變量都會(huì)存放在該對(duì)象所對(duì)應(yīng)的存儲(chǔ)空間中.
- 每一個(gè)對(duì)象內(nèi)部都有一個(gè)isa指針,指向他的類對(duì)象,類對(duì)象中存放著本對(duì)象的 a)對(duì)象方法列表(對(duì)象能夠接收的消息列表同诫,保存在它所對(duì)應(yīng)的類對(duì)象中粤策;b)成員變量的列表;c)屬性列表。
每個(gè) Objective-C 對(duì)象都有相同的結(jié)構(gòu)误窖,如下圖所示:
- 根對(duì)象就是NSObject掐场,它的superclass指針指向nil
- 類對(duì)象既然稱為對(duì)象,那它也是一個(gè)實(shí)例贩猎。類對(duì)象中也有一個(gè)isa指針指向它的元類(meta class),即類對(duì)象是元類的實(shí)例萍膛。元類內(nèi)部存放的是類方法列表吭服,根元類的isa指針指向自己,superclass指針指向NSObject類蝗罗。