iOS (2) --OC語言

<h1>1累奈、Difference between method and selector(方法和選擇器有何不同)?</h1>selector是一個方法的名字怯邪,method是一個組合體次屠,包含了名字和實現(xiàn).

<h1>2馏予、Core Foundation的內(nèi)存管理</h1> 凡是帶有Create掀宋、Copy深纲、Retain等字眼的函數(shù)仲锄,創(chuàng)建出來的對象,都需要在最后做一次release 比如CFRunLoopObserverCreate release函數(shù):CFRelease(對象);

<h1>3湃鹊、你是否接觸過OC中的反射機制儒喊?簡單聊一下概念和使用</h1> 1> class反射
a、通過類名的字符串形式實例化對象
Class class NSClassFromString@(@"student");
Student *stu = [[class alloc ]init];
b涛舍、將類名變?yōu)樽址?br> Class class =[Student class];
NSString className = NSStringFromClass(class);
2> SEL的反射
a澄惊、通過方法的字符串形式實例化方法
SEL selector = NSSelectorFromClass(@"setName");
[stu performSelector:selector withObject:@"Mike"];
b、將方法變成字符串
NSStringFomrSelector(@selector
(setName:))

<h1>4富雅、協(xié)議中<NSObject>是什么意思?子類繼承了父類,那么子類會遵守父類中遵守的協(xié)議嗎?協(xié)議中能夠定義成員變量?如何約束一個對象類型的變量要存儲的地址是遵守一個協(xié)議對象?</h1> 遵守NSObject協(xié)議

能望几,但是只在頭文件中聲明屠列,編譯器是不會自動生成實例變量的蛇捌。需要自己處理getter和setter方法
id<xxx>

<h1>5务漩、我們說的Objective-C是動態(tài)運行時語言是什么意思? (When we call objective c is runtime language what does it mean?)</h1> 主要是將數(shù)據(jù)類型的確定由編譯時,推遲到了運行時。這個問題其實淺涉及到兩個概念,運行時和多態(tài)蛤奢。
1> 簡單來說, 運行時機制使我們直到運行時才去決定一個對象的類別,以及調(diào)用該類別對象指定方法鬼癣。
2>多態(tài):不同對象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)。
意思就是假設(shè)生物類(life)都擁有一個相同的方法-eat;那人類屬于生物,豬也屬于生物,都繼承了life后,實現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法啤贩。也就是不同的對象以自己的方式響應(yīng)了相同的消 息(響應(yīng)了eat這個選擇器)待秃。因此也可以說,運行時機制是多態(tài)的基礎(chǔ).

<h1>6、簡述NotificationCenter痹屹、KVC章郁、KVO、Delegate?并說明它們之間的區(qū)別?(重點)</h1>

 KVO(Key-Value- Observing):一對多, 觀察者模式,鍵值觀察機制志衍,它提供了觀察某一屬性變化的方法暖庄,極大簡化了代碼。

KVC(Key-Value-Coding):是鍵值編碼, 一個對象在調(diào)用setValue的時候楼肪,檢查是否存在相應(yīng)key的set方法培廓,存在就調(diào)用set方法。
set方法不存在春叫,就查找_key的成員變量是否存在肩钠,存在就直接賦值。
如果_key沒找到暂殖,就查找相同名稱的key价匠,存在就賦值。如果沒有就調(diào)用valueForUndefinedkey和setValue:forUndefinedKey央星。

Delegate: 通常發(fā)送者和接收者的關(guān)系是直接的一對一的關(guān)系霞怀。代理的目的是改變或傳遞控制鏈惫东。
允許一個類在某些特定時刻通知到其他類莉给,而不需要獲取到那些類的指針毙石。可以減少框架復(fù)雜度颓遏。
消息的發(fā)送者(sender)告知接收者(receiver)某個事件將要發(fā)生徐矩,delegate同意然然后發(fā)送者響應(yīng)事件,
delegate機制使得接收者可以改變發(fā)送者的行為叁幢。

Notification: 觀察者模式, 通常發(fā)送者和接收者的關(guān)系是間接的多對多關(guān)系滤灯。
消息的發(fā)送者告知接收者事件已經(jīng)發(fā)生或者將要發(fā)送,僅此而已曼玩,接收者并不能反過來影響發(fā)送者的行為鳞骤。

由上可知區(qū)別如下:

1> 效率肯定是delegate比NSNotification高。
2> delegate方法比notification更加直接黍判,需要關(guān)注返回值豫尽,所以delegate方法往往包含should這個很傳神的詞。相反的顷帖,notification最大的特色就是不關(guān)心結(jié)果美旧。所以notification往往用did這個詞匯。
兩個模塊之間聯(lián)系不是很緊密贬墩,就用notification傳值榴嗅,例如多線程之間傳值用notificaiton。
delegate只是一種較為簡單的回調(diào)陶舞,且主要用在一個模塊中嗽测,例如底層功能完成了,需要把一些值傳到上層去吊说,就事先把上層的函數(shù)通過delegate傳到底層论咏,然后在底層call這個delegate,它們都在一個模塊中颁井,完成一個功能厅贪,例如說 NavgationController 從 B 界面到A 點返回按鈕 (調(diào)用popViewController方法) 可以用delegate比較好。

<h1>7雅宾、OC有多繼承嗎?沒有的話可以用什么方法替代?</h1> 多繼承即一個子類可以有多個父類,它繼承了多個父類的特性养涮。
Object-c的類沒有多繼承,只支持單繼承,如果要實現(xiàn)多繼承的話,可以通過類別和協(xié)議的方式來實現(xiàn)。
1> protocol(協(xié)議)可以實現(xiàn)多個接口,通過實現(xiàn)多個接口可以完成多繼承;
2> Category(類別)一般使用分類,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關(guān)系眉抬。

<h1>8贯吓、分別描述類別(categories)和延展(extensions)是什么?以及兩者的區(qū)別?繼承和類別在實現(xiàn)中有何區(qū)別?為什么Category只能為對象添加方法,卻不能添加成員變量?</h1> 類別: 在沒有原類.m文件的基礎(chǔ)上,給該類添加方法;
延展: 一種特殊形式的類別,主要在一個類的.m文件里聲明和實現(xiàn)延展的作用,就是給某類添加私有方法或是私有變量。
兩個的區(qū)別:
1> 延展可以添加屬性并且它添加的方法是必須要實現(xiàn)的蜀变。延展可以認為是一個私有的類目悄谐。
類別可以在不知道,不改變原來代碼的情況下往里面添加新的方法,只能添加,不能刪除修改。
并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因為類別具有更高的優(yōu)先級库北。
繼承可以增加爬舰,修改刪除方法们陆,添加屬性。
Category只能為對象添加方法,卻不能添加成員變量的原因:如果可以添加成員變量,添加的成員變量沒有辦法初始化

<h1>9情屹、include與#import的區(qū)別? #import與@class的區(qū)別?</h1> import指令是Object-C針對#include的改進版本坪仇,#import確保引用的文件只會被引用一次,這樣你就不會陷入遞歸包含的問題中垃你。

import與@class二者的區(qū)別在于:
1> import會鏈入該頭文件的全部信息椅文,包括實例變量和方法等;而@class只是告訴編譯器惜颇,其后面聲明的名稱是類的名稱皆刺,至于這些類是如何定義的,暫時不用考慮凌摄。
2> 在頭文件中一般使用@class來聲明這個名稱是類的名稱,不需要知道其內(nèi)部的實體變量和方法.
而在實現(xiàn)類里面芹橡,因為會用到這個引用類的內(nèi)部的實體變量和方法,所以需要使用#import來包含這個被引用類的頭文件望伦。
3> 在編譯效率方面林说,如果你有100個頭文件都#import了同一個頭文件,或者這些文件是依次引用的屯伞,如A–>B, B–>C, C–>D這樣的引用關(guān)系腿箩。當最開始的那個頭文件有變化的話,后面所有引用它的類都需要重新編譯劣摇,如果你的類有很多的話珠移,這將耗費大量的時間。而是用@class則不會末融。
4> 如果有循環(huán)依賴關(guān)系钧惧,如:A–>B, B–>A這樣的相互依賴關(guān)系,如果使用#import來相互包含勾习,那么就會出現(xiàn)編譯錯誤浓瞪,如果使用@class在兩個類的頭文件中相互聲明,則不會有編譯錯誤出現(xiàn)巧婶。

<h1>10乾颁、淺復(fù)制(拷貝)和深復(fù)制的區(qū)別? (Difference between shallow copy and deep copy?)</h1> 淺復(fù)制(copy):只復(fù)制指向?qū)ο蟮闹羔槪粡?fù)制引用對象本身艺栈。
深復(fù)制(mutableCopy):復(fù)制引用對象本身英岭。深復(fù)制就好理解了,內(nèi)存中存在了兩份獨立對象本身, 當修改A時,A_copy不變。

<h1>11湿右、類變量的@protected,@private,@public,@package聲明各有什么含義?</h1> 變量的作用域不同诅妹。

@protected 該類和子類中訪問,是默認的;
@private 只能在本類中訪問;
@public 任何地方都能訪問;
@package 本包內(nèi)使用毅人,跨包不可以

<h1>12吭狡、Objective-C與C荧库、C+++之間的聯(lián)系和區(qū)別?</h1> 1> Objective-C和C++都是C的面向?qū)ο蟮某?br> 2> Object與C++的區(qū)別主要點:Objective-C是完全動態(tài)的赵刑,支持在運行時動態(tài)類型決議(dynamic typing),動態(tài)綁定(dynamic binding)以及動態(tài)裝載(dynamic loading)场刑;而C++是部分動態(tài)的般此,編譯時靜態(tài)綁定,通過嵌入類(多重繼承)和虛函數(shù)(虛表)來模擬實現(xiàn)牵现。
3> Objective-C 在語言層次上支持動態(tài)消息轉(zhuǎn)發(fā)铐懊,其消息發(fā)送語法為 [object function]; 而且C++ 為 object->function()瞎疼。 兩者的語義也不同科乎,在 Objective-C 里是說發(fā)送消息到一個對象上,至于這個對象能不能響應(yīng)消息以及是響應(yīng)還是轉(zhuǎn)發(fā)消息都不會 crash贼急; 而在 C++ 里是說對象進行了某個操作茅茂,如果對象沒有這個操作的話,要么編譯會報錯(靜態(tài)綁定)太抓,要么程序會 crash 掉的(動態(tài)綁定)空闲。

<h1>13、目標-動作機制</h1> 1> 目標是動作消息的接收者走敌。一個控件碴倾,或者更為常見的是它的單元,以插座變量的形式保有其動作消息的目標掉丽。
2>動作是控件發(fā)送給目標的消息跌榔,或者從目標的角度看,它是目標為了響應(yīng)動作而實現(xiàn)的方法. 程序需要某些機制來進行事件和指令的翻譯捶障。這個機制就是目標-動作機制僧须。

<h1>14、Objective-C優(yōu)點和缺點</h1> 優(yōu)點:1.Cateogies 2.Posing 3.動態(tài)識別 4.指標計算 5.彈性訊息傳遞 6.不是一個過度復(fù)雜的C衍生語言 7.Objective-C與C++可混合編程

缺點:1.不支持命名空間 2.不支持運算符重載 3.不支持多重繼承 4.使用動態(tài)運行時類型,所有的方法都是函數(shù)調(diào)用,所以很多編譯時優(yōu)化方法都用不到项炼。(如內(nèi)聯(lián)函數(shù)等),性能低劣皆辽。

<h1>15、C與OC混用</h1> 處理.m可以識別c和oc芥挣,.mm可以識別c c++ oc 但是cpp只能用c/c++

<h1>16驱闷、atomic和nonatomic的區(qū)別</h1> atomic提供多線程安全,防止讀寫未完成的時候被另外一個線程讀寫空免,造成數(shù)據(jù)錯誤空另。
nonatomic在自己管理內(nèi)存的環(huán)境中,解析的訪問器保留并自動釋放返回值蹋砚,若指定了nonatomic扼菠,那么訪問器只是簡單的返回這個值摄杂。

<h1>17、常見的oc數(shù)據(jù)類型哪些循榆,和c的基本類型有啥區(qū)別</h1> 常見的:NSInteger CGFloat NSString NSNumber NSArray NSDate
NSInteger根據(jù)32或者64位系統(tǒng)決定本身是int還是long
CGFloat根據(jù)32或者64位系統(tǒng)決定本身是float還是double
NSString NSNumber NSArray NSDate都是指針類型的對象析恢,在堆中分配內(nèi)存,c語言中的char int 等都是在棧中分配空間

<h1>18秧饮、id和nil代表什么</h1> id類型的指針可以指向任何OC對象
nil代表空值(空指針的值映挂,0)

<h1>19、nil盗尸、Nil柑船、NULL和NSNull區(qū)別?</h1> 1> nil和C語言的NULL相同泼各,在objc/objc.h中定義鞍时。nil表示Objective-C對象的值為空。在C語言中扣蜻,指針的空值用NULL表示逆巍。在Objective-C中,nil對象調(diào)用任何方法表示什么也不執(zhí)行莽使,也不會崩潰蒸苇。
2> Nil:那么對于我們Objective-C開發(fā)來說,Nil也就代表((void )0)吮旅。但是它是用于代表空類的. 比如:Class myClass = Nil;
3> NULL: 在C語言中溪烤,NULL是無類型的,只是一個宏庇勃,它代表空. 這就是在C/C++中的空指針檬嘀。對于我們Objective-C開發(fā)來說,NULL就表示((void
)0).
NSNull:NSNull是繼承于NSObject的類型责嚷。它是很特殊的類鸳兽,它表示是空,什么也不存儲罕拂,但是它卻是對象揍异,只是一個占位對象。使用場景就不一樣了爆班,比如說服務(wù)端接口中讓我們在值為空時衷掷,傳空。NSDictionry *parameters = @{@"arg1" : @"value1",@"arg2" : arg2.isEmpty ? [NSNull null] : arg2};

4> NULL柿菩、nil戚嗅、Nil這三者對于Objective-C中值是一樣的,都是(void *)0,那么為什么要區(qū)分呢懦胞?又與NSNull之間有什么區(qū)別:

5> NULL是宏替久,是對于C語言指針而使用的,表示空指針
6> nil是宏躏尉,是對于Objective-C中的對象而使用的蚯根,表示對象為空
7> Nil是宏,是對于Objective-C中的類而使用的胀糜,表示類指向空
8> NSNull是類類型颅拦,是用于表示空的占位對象,與JS或者服務(wù)端的null類似的含意

<h1>20僚纷、向一個nil對象發(fā)送消息會發(fā)生什么?</h1> 1> 向nil發(fā)送消息是完全有效的——只是在運行時不會有任何作用拗盒。
2> 如果一個方法返回值是一個對象怖竭,那么發(fā)送給nil的消息將返回0(nil)
3> 如果方法返回值為指針類型,其指針大小為小于或者等于sizeof(void*)陡蝇,float痊臭,double,long double 或者long long的整型標量登夫,發(fā)送給nil的消息將返回0广匙。
4> 如果方法返回值為結(jié)構(gòu)體,正如在《Mac OS X ABI 函數(shù)調(diào)用指南》恼策,發(fā)送給nil的消息將返回0鸦致。結(jié)構(gòu)體中各個字段的值將都是0。其他的結(jié)構(gòu)體數(shù)據(jù)類型將不是用0填充的涣楷。
5> 如果方法的返回值不是上述提到的幾種情況分唾,那么發(fā)送給nil的消息的返回值將是未定義的

<h1>21、self.和self->的區(qū)別</h1> 1> self.是調(diào)用get或者set方法
2> self是當前本身狮斗,是一個指向當前對象的指針
3> self->是直接訪問成員變量

<h1>22绽乔、_block/weak修飾符區(qū)別</h1> 1> _block在arc和mrc環(huán)境下都能用,可以修飾對象碳褒,也能修飾基本數(shù)據(jù)類型
2> _weak只能在arc環(huán)境下使用折砸,只能修飾對象(NSString),不能修飾基本數(shù)據(jù)類型(int)
3> _block對象可以在block中重新賦值沙峻,_weak不行睦授。

<h1>23、@property的本質(zhì)是什么摔寨?ivar睹逃、getter、setter是如何生成并添加到這個類中的?</h1>

@property的本質(zhì):
@property = ivar(實例變量) + getter(取方法) + setter(存方法)
“屬性” (property)有兩大概念:ivar(實例變量)沉填、存取方法(access method = getter + setter)
ivar疗隶、getter、setter如何生成并添加到類中:
這是編譯器自動合成的翼闹,通過@synthesize關(guān)鍵字指定斑鼻,若不指定,默認為@synthesize propertyName = _propertyName;
若手動實現(xiàn)了getter/setter方法猎荠,則不會自動合成坚弱。
現(xiàn)在編譯器已經(jīng)默認為我們添加@synthesize propertyName = _propertyName;因此不再需要手動添加了,除非你真的要改成員變量名关摇。
生成getter方法時荒叶,會判斷當前屬性名是否有_,比如聲明屬性為@property (nonatomic, copy) NSString *_name;
那么所生成的成員變量名就會變成__name输虱,如果我們要手動生成getter方法些楣,就要判斷是否以_開頭了。
不過宪睹,命名都要有規(guī)范愁茁,是不允許聲明屬性是使用_開頭的,不規(guī)范的命名亭病,在使用runtime時鹅很,會帶來很多的不方便的。

<h1>24罪帖、這個寫法會出什么問題:@property (copy) NSMutableArray *array;</h1> 1> 沒有指明為nonatomic促煮,因此就是atomic原子操作,會影響性能整袁。該屬性使用了同步鎖污茵,會在創(chuàng)建時生成一些額外的代碼用于幫助編寫多線程程序,這會帶來性能問題葬项,通過聲明nonatomic可以節(jié)省這些雖然很小但是不必要額外開銷泞当。在我們的應(yīng)用程序中,幾乎都是使用nonatomic來聲明的民珍,因為使用atomic并不能保證絕對的線程安全襟士,對于要絕對保證線程安全的操作,還需要使用更高級的方式來處理嚷量,比如NSSpinLock陋桂、@syncronized等
2> 因為使用的是copy,所得到的實際是NSArray類型蝶溶,它是不可變的嗜历,若在使用中使用了增宣渗、刪、改操作梨州,則會crash

<h1>25痕囱、@protocol和category中如何使用 @property</h1>

在protocol中使用@property只會生成setter和getter方法聲明,我們使用屬性的目的是希望遵守我協(xié)議的對象能實現(xiàn)該屬性
?    category使用@property也是只會生成setter和getter方法的聲明暴匠,如果我們真的需要給category增加屬性的實現(xiàn)鞍恢,需要借助于運行時的兩個函數(shù):
?    objc_setAssociatedObject
?    objc_getAssociatedObject

<h1>26、@property中有哪些屬性關(guān)鍵字每窖?</h1> 1> 原子性 (atomic帮掉,nonatomic)
2> 讀寫(readwrite, readonly)
3> 內(nèi)存管理(assign, strong, weak, unsafe_unretained,copy)
4> getter、setter

<h1>27窒典、isa指針問題</h1> isa:是一個Class 類型的指針. 每個實例對象有個isa的指針,他指向?qū)ο蟮念愺〈叮鳦lass里也有個isa的指針, 指向meteClass(元類)。元類保存了類方法的列表瀑志。當類方法被調(diào)用時涩搓,先會從本身查找類方法的實現(xiàn),如果沒有后室,元類會向他父類查找該方法缩膝。同時注意的是:元類(meteClass)也是類混狠,它也是對象岸霹。元類也有isa指針,它的isa指針最終指向的是一個根元類(root meteClass).根元類的isa指針指向本身,這樣形成了一個封閉的內(nèi)循環(huán)将饺。

<h1>28贡避、如何訪問并修改一個類的私有屬性?</h1> 一種是通過KVC獲取
通過runtime訪問并修改私有屬性

<h1>29予弧、如何為 Class 定義一個對外只讀對內(nèi)可讀寫的屬性?</h1> 在頭文件中將屬性定義為readonly,在.m文件中將屬性重新定義為readwrite

<h1>30刮吧、Objective-C 中,meta-class 指的是什么掖蛤?</h1> meta-class 是 Class 對象的類,為這個Class類存儲類方法,當一個類發(fā)送消息時,就去這個類對應(yīng)的meta-class中查找那個消息,每個Class都有不同的meta-class,所有的meta-class都使用基類的meta-class(假如類繼承NSObject,那么他所對應(yīng)的meta-class也是NSObject)作為他們的類

<h1>31杀捻、Objective-C 的class是如何實現(xiàn)的?Selector是如何被轉(zhuǎn)化為 C 語言的函數(shù)調(diào)用的蚓庭?</h1>

1>當一個類被正確的編譯過后致讥,在這個編譯成功的類里面,存在一個變量用于保存這個類的信息器赞。我們可以通過[NSClassFromString]或[obj class]垢袱。這樣的機制允許我們在程序執(zhí)行的過程當中,可以Class來得到對象的類港柜,也可以在程序執(zhí)行的階段動態(tài)的生成一個在編譯階段無法確定的一個對象请契。 (isa指針)
2> @selector()基本可以等同C語言的中函數(shù)指針,只不過C語言中,可以把函數(shù)名直接賦給一個函數(shù)指針,而Object-C的類不能直接應(yīng)用函數(shù)指針爽锥,這樣只能做一個@selector語法來取.

@interface foo
-(int)add:int val;
@end
SEL class_func ; //定義一個類方法指針
class_func = @selector(add:int);

3> @selector是查找當前類的方法涌韩,而[object @selector(方法名:方法參數(shù)..) ] ;是取object對應(yīng)類的相應(yīng)方法.
查找類方法時,除了方法名,方法參數(shù)也查詢條件之一.
可以用字符串來找方法 SEL 變量名 = NSSelectorFromString(方法名字的字符串);
可以運行中用SEL變量反向查出方法名字字符串救恨。NSString *變量名 = NSStringFromSelector(SEL參數(shù));

4> 取到selector的值以后贸辈,執(zhí)行seletor。 SEL變量的執(zhí)行.用performSelecor方法來執(zhí)行.
[對象 performSelector:SEL變量 withObject:參數(shù)1 withObject:參數(shù)2];

<h1>32肠槽、對于語句NSString *obj = [[NSData alloc] init]; 擎淤,編譯時和運行時obj分別是什么類型?</h1> 編譯時是NSString類型 秸仙,運行時是NSData類型.

<h1>33嘴拢、@synthesize和@dynamic分別有什么作用?</h1> 1> @property有兩個對應(yīng)的詞寂纪,一個是 @synthesize席吴,一個是 @dynamic。如果 @synthesize和 @dynamic都沒寫捞蛋,那么默認的就是@syntheszie var = _var;
2> @synthesize 的語義是如果你沒有手動實現(xiàn) setter 方法和 getter 方法孝冒,那么編譯器會自動為你加上這兩個方法。
3> @dynamic 告訴編譯器:屬性的 setter 與 getter 方法由用戶自己實現(xiàn)拟杉,不自動生成庄涡。(當然對于 readonly 的屬性只需提供 getter 即可)。假如一個屬性被聲明為 @dynamic var搬设,然后你沒有提供 @setter方法和 @getter 方法穴店,編譯的時候沒問題,但是當程序運行到 instance.var = someVar拿穴,由于缺 setter 方法會導(dǎo)致程序崩潰泣洞;或者當運行到 someVar = var 時,由于缺 getter 方法同樣會導(dǎo)致崩潰默色。編譯時沒問題球凰,運行時才執(zhí)行相應(yīng)的方法,這就是所謂的動態(tài)綁定腿宰。

<h1>34呕诉、NSString 的時候用copy和strong的區(qū)別?</h1> OC中NSString為不可變字符串的時候酗失,用copy和strong都是只分配一次內(nèi)存义钉,但是如果用copy的時候,需要先判斷字符串是否是不可變字符串规肴,如果是不可變字符串捶闸,就不再分配空間夜畴,如果是可變字符串才分配空間。如果程序中用到NSString的地方特別多删壮,每一次都要先進行判斷就會耗費性能贪绘,影響用戶體驗,用strong就不會再進行判斷央碟,所以税灌,不可變字符串可以直接用strong。

<h1>35亿虽、NSArray菱涤、NSSet、NSDictionary與NSMutableArray洛勉、NSMutableSet粘秆、NSMutableDictionary的特性和作用(遇到copy修飾產(chǎn)生的變化)</h1> 特性:
NSArray表示不可變數(shù)組,是有序元素集收毫,只能存儲對象類型攻走,可通過索引直接訪問元素,而且元素類型可以不一樣此再,但是不能進行增昔搂、刪、改操作输拇;NSMutableArray是可變數(shù)組摘符,能進行增、刪淳附、改操作议慰。通過索引查詢值很快蠢古,但是插入奴曙、刪除等效率很低。
NSSet表示不可變集合草讶,具有確定性洽糟、互異性、無序性的特點堕战,只能訪問而不能修改集合坤溃;NSMutableSet表示可變集合,可以對集合進行增嘱丢、刪薪介、改操作。集合通過值查詢很快越驻,插入汁政、刪除操作極快道偷。
NSDictionary表示不可變字典,具有無序性的特點记劈,每個key對應(yīng)的值是唯一的勺鸦,可通過key直接獲取值;NSMutableDictionary表示可變字典目木,能對字典進行增换途、刪、改操作刽射。通過key查詢值军拟、插入、刪除值都很快誓禁。
<h1></h1>
作用:
數(shù)組用于處理一組有序的數(shù)據(jù)集吻谋,比如常用的列表的dataSource要求有序,可通過索引直接訪問现横,效率高漓拾。
集合要求具有確定性、互異性戒祠、無序性骇两,在iOS開發(fā)中是比較少使用到的,筆者也不清楚如何說明其作用
字典是鍵值對數(shù)據(jù)集姜盈,操作字典效率極高低千,時間復(fù)雜度為常量,但是值是無序的馏颂。在ios中示血,常見的JSON轉(zhuǎn)字典,字典轉(zhuǎn)模型就是其中一種應(yīng)用救拉。

<h1>36迹辐、怎樣使用performSelector傳入3個以上參數(shù)栗竖,其中一個為結(jié)構(gòu)體</h1>

- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

因為系統(tǒng)提供的performSelector的api中,并沒有提供三個參數(shù)。因此嘿悬,我們只能傳數(shù)組或者字典么库,但是數(shù)組或者字典只有存入對象類型购笆,而結(jié)構(gòu)體并不是對象類型剃浇,那么怎么辦呢?
沒有辦法蒂萎,我們只能通過對象放入結(jié)構(gòu)作為屬性來傳過去了:

ypedef struct HYBStruct {
  int a;
  int b;
} *my_struct;

@interface HYBObject : NSObject

@property (nonatomic, assign) my_struct arg3;
@property (nonatomic, copy)  NSString *arg1;
@property (nonatomic, copy) NSString *arg2;

@end

@implementation HYBObject

// 在堆上分配的內(nèi)存秆吵,我們要手動釋放掉
- (void)dealloc {
  free(self.arg3);
}

@end

測試:

my_struct str = (my_struct)(malloc(sizeof(my_struct)));
str->a = 1;
str->b = 2;
HYBObject *obj = [[HYBObject alloc] init];
obj.arg1 = @"arg1";
obj.arg2 = @"arg2";
obj.arg3 = str;

[self performSelector:@selector(call:) withObject:obj];

// 在回調(diào)時得到正確的數(shù)據(jù)的
- (void)call:(HYBObject *)obj {
    NSLog(@"%d %d", obj.arg3->a, obj.arg3->b);
}

<h1>37、objc中向一個對象發(fā)送消息[obj foo]和objc_msgSend()函數(shù)之間有什么關(guān)系五慈?</h1> 實際上纳寂,編譯器在編譯時會轉(zhuǎn)換成objc_msgSend实苞,大概會像這樣:
((void (*)(id, SEL))(void)objc_msgSend)((id)obj, sel_registerName("foo"));
也就是說,[obj foo];在objc動態(tài)編譯時烈疚,會被轉(zhuǎn)換為:objc_msgSend(obj, @selector(foo));這樣的形式黔牵,但是需要根據(jù)具體的參數(shù)類型及返回值類型進行相應(yīng)的類型轉(zhuǎn)換。

<h1>38爷肝、下面的代碼輸出什么猾浦?</h1>

@implementation Son : Father

- (id)init {
    self = [super init];
    if (self) {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}

@end

// 輸出
NSStringFromClass([self class]) = Son
NSStringFromClass([super class]) = Son
這個題目主要是考察關(guān)于Objective-C中對self和super的理解。我們都知道:self是類的隱藏參數(shù)灯抛,指向當前調(diào)用方法的這個類的實例金赦。那super呢?
很多人會想當然的認為“super和self類似对嚼,應(yīng)該是指向父類的指針吧夹抗!”。這是很普遍的一個誤區(qū)纵竖。
其實 super是一個 Magic Keyword漠烧,它本質(zhì)是一個編譯器標示符,和self 是指向的同一個消息接受者靡砌!
他們兩個的不同點在于:super會告訴編譯器已脓,調(diào)用class 這個方法時,要去父類的方法通殃,而不是本類里的度液。
上面的例子不管調(diào)用[self class]還是[super class],接受消息的對象都是當前 Son *xxx 這個對象画舌。
當使用self調(diào)用方法時堕担,會從當前類的方法列表中開始找,如果沒有曲聂,就從父類中再找霹购;
而當使用super時,則從父類的方法列表中開始找句葵。然后調(diào)用父類的這個方法厕鹃。

<h1>39兢仰、若一個類有實例變量NSString *_foo乍丈,調(diào)用setValue:forKey:時,可以以foo還是_foo作為key把将?</h1> 兩者都可以轻专。

<h1>40、什么時候使用NSMutableArray察蹲,什么時候使用NSArray?</h1> 當數(shù)組在程序運行時请垛,需要不斷變化的催训,使用NSMutableArray,當數(shù)組在初始化后宗收,便不再改變的漫拭,使用NSArray。需要指出的是混稽,使用NSArray只表明的是該數(shù)組在運行時不發(fā)生改變采驻,即不能往NSAarry的數(shù)組里新增和刪除元素,但不表明其數(shù)組內(nèi)的元素的內(nèi)容不能發(fā)生改變匈勋。NSArray是線程安全的礼旅,NSMutableArray不是線程安全的,多線程使用到NSMutableArray需要注意洽洁。

<h1>41痘系、類NSObject的那些方法經(jīng)常被使用?</h1> NSObject是Objetive-C的基類,其由NSObject類及一系列協(xié)議構(gòu)成饿自。
其中類方法alloc汰翠、class、 description 對象方法init昭雌、dealloc奴璃、– performSelector:withObject:afterDelay:等經(jīng)常被使用

<h1>42、什么是簡便構(gòu)造方法?</h1> 1> 簡便構(gòu)造方法一般由CocoaTouch框架提供城豁,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
2> Foundation下大部分類均有簡便構(gòu)造方法苟穆,我們可以通過簡便構(gòu)造方法,獲得系統(tǒng)給我們創(chuàng)建好的對象唱星,并且不需要手動釋放雳旅。

<h1>43、結(jié)構(gòu)體當中能定義oc對象嗎间聊?</h1> 不能, 因為結(jié)構(gòu)體當中只能是類型的聲明不能進行分配空間

<h1>44攒盈、點語法本質(zhì)是什么,寫一個點語法的例子,并寫上注釋</h1>

點語法的本質(zhì)是方法的調(diào)用,而不是訪問成員變量哎榴,當使用點語法時型豁,編譯器會自動展開成相應(yīng)的方法。切記點語法的本質(zhì)是轉(zhuǎn)換成相應(yīng)的set和get方法尚蝌,如果沒有set和get方法迎变,則不能使用點語法。
例如有一個Person類 通過@property定義了name和age屬性,再提供了一個run方法飘言。
Person *person = [Person new];
person.name=@”itcast”;//調(diào)用了person的setName方法
int age = person.age; // 調(diào)用了person的age方法
person.run //調(diào)用了person的run方法

<h1>45衣形、id類型是什么,instancetype是什么姿鸿,有什么區(qū)別谆吴?</h1> 1> id類型:萬能指針倒源,能作為參數(shù),方法的返回類型句狼。
2> instancetype:只能作為方法的范圍類型笋熬,并且返回的類型是當前定義類的類類型。

<h1>46腻菇、成員變量名的命名以下劃線開頭的好處突诬?</h1> 1> 與get方法的方法名區(qū)分開來;
2> 可以和一些其他的局部變量區(qū)分開來芜繁,下劃線開頭的變量旺隙,通常都是類的成員變量。

<h1>47骏令、這段代碼有什么問題嗎:</h1>

@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge; }
@end
會死循環(huán),會重復(fù)調(diào)用自己!self.age 改為_age即可;
并且書寫不規(guī)范:setter方法中的newAge應(yīng)該為age

<h1>48蔬捷、截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的數(shù)據(jù),分別輸出它們。</h1>

NSString * str = @"20 | http://www.baidu.com";
NSArray *array = [str componentsSeparatedByString:@"|"]; //這是分別輸出的截取后的字符串
for (int i = 0; i<[array count]; ++i) { NSLog(@"%d=%@",i,[array objectAtIndex:i]);
}

<h1>49榔袋、isKindOfClass周拐、isMemberOfClass、selector作用分別是什么</h1> 1> isKindOfClass,作用是,某個對象屬于某個類型或者繼承自某類型
2> isMemberOfClass:某個對象確切屬于某個類型
3> selector:通過方法名,獲取在內(nèi)存中的函數(shù)的入口地址

<h1>50凰兑、請分別寫出SEL妥粟、id、@的意思?</h1> 1> SEL是“selector”的一個類型,表示一個方法的名字-------就是一個方法的入口地址
2> id是一個指向任何一個繼承了Object(或者NSObject)類的對象吏够。需要注意的是id是一個指針,所以在使用id 的時候不需要加*勾给。
3> @:OC中的指令符

<h1>51、unsigned int 和int 有什么區(qū)別锅知。假設(shè)int長度為65535播急,請寫出unsigned int與 int的取值范圍</h1> int:基本整型,當字節(jié)數(shù)為2時 取值范圍為-32768~32767售睹,當字節(jié)數(shù)為4時 取值范圍
負的2的31次方 到 2的31次方減1
unsigned int:無符號基本整型桩警,當字節(jié)數(shù)為2時 取值范圍為0~65535,當字節(jié)數(shù)為4時 取值范圍為0到2的32次方減1

<h1>52昌妹、Foundation對象與Core Foundation對象有什么區(qū)別</h1> Foundation對象是OC的捶枢,Core Foundation對象是C對象
數(shù)據(jù)類型之間的轉(zhuǎn)換
ARC:bridge_retained(持有對象所有權(quán),F->CF)、bridge_transfer(釋放對象有所權(quán)CF->F)
非ARC: __bridge

<h1>53飞崖、編寫一個函數(shù)烂叔,實現(xiàn)遞歸刪除指定路徑下的所有文件。</h1>

+ (void)deleteFiles:(NSString *)path;{
    // 1.判斷文件還是目錄
    NSFileManager * fileManger = [NSFileManager defaultManager];
    BOOL isDir = NO;
    BOOL isExist = [fileManger fileExistsAtPath:path isDirectory:&isDir];
    if (isExist) {
        // 2. 判斷是不是目錄
        if (isDir) {
        NSArray * dirArray = [fileManger contentsOfDirectoryAtPath:path error:nil];
            NSString * subPath = nil;
            for (NSString * str in dirArray) {
                subPath  = [path stringByAppendingPathComponent:str];
                BOOL issubDir = NO;
                 [fileManger fileExistsAtPath:subPath isDirectory:&issubDir];
                [self deleteFiles:subPath];
            }


        }else{
            NSLog(@"%@",path);
            [manager removeItemAtPath:filePath error:nil];  
        }
    }else{
        NSLog(@"你打印的是目錄或者不存在");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚜厉,一起剝皮案震驚了整個濱河市长已,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昼牛,老刑警劉巖术瓮,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異贰健,居然都是意外死亡胞四,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門伶椿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辜伟,“玉大人,你說我怎么就攤上這事脊另〉冀疲” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵偎痛,是天一觀的道長旱捧。 經(jīng)常有香客問我,道長踩麦,這世上最難降的妖魔是什么枚赡? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮谓谦,結(jié)果婚禮上贫橙,老公的妹妹穿的比我還像新娘。我一直安慰自己反粥,他們只是感情好卢肃,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著才顿,像睡著了一般践剂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娜膘,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天逊脯,我揣著相機與錄音,去河邊找鬼竣贪。 笑死军洼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的演怎。 我是一名探鬼主播匕争,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爷耀!你這毒婦竟也來了甘桑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎跑杭,沒想到半個月后铆帽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡德谅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年爹橱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窄做。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡愧驱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椭盏,到底是詐尸還是另有隱情组砚,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布掏颊,位于F島的核電站糟红,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚯舱。R本人自食惡果不足惜改化,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枉昏。 院中可真熱鬧陈肛,春花似錦、人聲如沸兄裂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晰奖。三九已至谈撒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匾南,已是汗流浹背啃匿。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛆楞,地道東北人溯乒。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像豹爹,于是被迫代替她去往敵國和親裆悄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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