可能碰到的iOS筆試面試題(5)--Objective-C

面試筆試都是必考語法知識(shí)的。請(qǐng)認(rèn)真復(fù)習(xí)和深入研究OC技即。

Objective-C

方法和選擇器有何不同?(Difference between method and selector?)

  • selector是一個(gè)方法的名字,method是一個(gè)組合體进萄,包含了名字和實(shí)現(xiàn).

Core Foundation的內(nèi)存管理

  • 凡是帶有Create筛谚、Copy磁玉、Retain等字眼的函數(shù),創(chuàng)建出來的對(duì)象驾讲,都需要在最后做一次release
  • 比如CFRunLoopObserverCreate release函數(shù):CFRelease(對(duì)象);

malloc和New的區(qū)別

  • new 是c++中的操作符蚊伞,malloc是c 中的一個(gè)函數(shù)

  • new 不止是分配內(nèi)存席赂,而且會(huì)調(diào)用類的構(gòu)造函數(shù),同理delete會(huì)調(diào)用類的析構(gòu)函數(shù)时迫,而malloc則只分配內(nèi)存颅停,不會(huì)進(jìn)行初始化類成員的工作,同樣free也不會(huì)調(diào)用析構(gòu)函數(shù)

  • 內(nèi)存泄漏對(duì)于malloc或者new都可以檢查出來的掠拳,區(qū)別在于new可以指明是那個(gè)文件的那一行癞揉, 而malloc沒有這些信息。

  • new 和 malloc效率比較

  • new可以認(rèn)為是malloc加構(gòu)造函數(shù)的執(zhí)行碳想。

  • new出來的指針是直接帶類型信息的烧董。

你是否接觸過OC中的反射機(jī)制?簡(jiǎn)單聊一下概念和使用

  • class反射
  • 通過類名的字符串形式實(shí)例化對(duì)象
    Class class NSClassFromString@(@"student");
    Student *stu = [[class alloc ]init];
  • 將類名變?yōu)樽址?br> Class class =[Student class];
    NSString *className = NSStringFromClass(class);
  • SEL的反射
  • 通過方法的字符串形式實(shí)例化方法
    SEL selector = NSSelectorFromClass(@"setName");
    [stu performSelector:selector withObject:@"Mike"];
  • 將方法變成字符串
    NSStringFomrSelector(@selector*(setName:))

什么是SEL?如何聲明一個(gè)SEL?通過那些方法能夠,調(diào)用SEL包裝起來的方法?

  • SEL就是對(duì)方法的一種包裝胧奔。包裝的SEL類型數(shù)據(jù)它對(duì)應(yīng)相應(yīng)的方法地址逊移,找到方法地址就可以調(diào)用方法。在內(nèi)存中每個(gè)類的方法都存儲(chǔ)在類對(duì)象中龙填,每個(gè)方法都有一個(gè)與之對(duì)應(yīng)的SEL類型的數(shù)據(jù)胳泉,根據(jù)一個(gè)SEL數(shù)據(jù)就可以找到對(duì)應(yīng)的方法地址,進(jìn)而調(diào)用方法岩遗。

  • SEL s1 = @selector(test1); // 將test1方法包裝成SEL對(duì)象

  • SEL s2 = NSSelectorFromString(@"test1"); // 將一個(gè)字符串方法轉(zhuǎn)換成為SEL對(duì)象

  • 調(diào)用方法有兩種方式:

  • 1.直接通過方法名來調(diào)用 [person text]

  • 2.間接的通過SEL數(shù)據(jù)來調(diào)用 SEL aaa=@selector(text); [person performSelector:aaa];

協(xié)議中<NSObject>是什么意思?子類繼承了父類,那么子類會(huì)遵守父類中遵守的協(xié)議嗎?協(xié)議中能夠定義成員變量?如何約束一個(gè)對(duì)象類型的變量要存儲(chǔ)的地址是遵守一個(gè)協(xié)議對(duì)象?

  • 遵守NSObject協(xié)議
  • 會(huì)
  • 能扇商,但是只在頭文件中聲明,編譯器是不會(huì)自動(dòng)生成實(shí)例變量的宿礁。需要自己處理getter和setter方法
  • id<xxx>

NS/CF/CG/CA/UI這些前綴分別是什么含義

  • 函數(shù)歸屬于屬于cocoa Fundation框架
  • 函數(shù)歸屬于屬于core Fundation框架
  • 函數(shù)歸屬于屬于CoreGraphics.frameworks框架
  • 函數(shù)歸屬于屬于CoreAnimation.frameworks框架
  • 函數(shù)歸屬于屬于UIkit框架

面向?qū)ο蠖加心男┨卣饕约澳銓?duì)這些特征的理解案铺。

  • 繼承:繼承是從已有類得到繼承信息創(chuàng)建新類的過程。提供繼承信息的類被稱為父類(超類梆靖、基類)控汉;得到繼承信息的類被稱為子類(派生類)。 繼承讓變化中的軟件系統(tǒng)有了一定的延續(xù)性返吻,同時(shí)繼承也是封裝程序中可變因素的重要手段姑子。

  • 封裝:封裝是把數(shù)據(jù)和操作數(shù)據(jù)的方法綁定起來,對(duì)數(shù)據(jù)的訪問只能通過已定義的接口测僵。我們?cè)陬愔芯帉懙姆椒ň褪菍?duì)實(shí)現(xiàn)細(xì)節(jié)的一種封裝街佑;我們編寫一個(gè)類就是對(duì)數(shù)據(jù)和數(shù)據(jù)操作的封裝『纯浚可以說沐旨,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡(jiǎn)單的編程接口榨婆。

  • 多態(tài)性:多態(tài)性是指允許不同子類型的對(duì)象對(duì)同一消息作出不同的響應(yīng)希俩。簡(jiǎn)單的說就是用同樣的對(duì)象引用調(diào)用同樣的方法但是做了不同的事情。多態(tài)性分為編譯時(shí)的多態(tài)性和運(yùn)行時(shí)的多態(tài)性纲辽。方法重載(overload)實(shí)現(xiàn)的是編譯時(shí)的多態(tài)性(也稱為前綁定)颜武,而方法重寫(override)實(shí)現(xiàn)的是運(yùn)行時(shí)的多態(tài)性(也稱為后綁定)璃搜。運(yùn)行時(shí)的多態(tài)是面向?qū)ο笞罹璧臇|西,要實(shí)現(xiàn)多態(tài)需要做兩件事:1. 方法重寫(子類繼承父類并重寫父類中已有的或抽象的方法)鳞上;2. 對(duì)象造型(用父類型引用引用子類型對(duì)象这吻,這樣同樣的引用調(diào)用同樣的方法就會(huì)根據(jù)子類對(duì)象的不同而表現(xiàn)出不同的行為)。

  • 抽象:抽象是將一類對(duì)象的共同特征總結(jié)出來構(gòu)造類的過程篙议,包括數(shù)據(jù)抽象和行為抽象兩方面唾糯。抽象只關(guān)注對(duì)象有哪些屬性和行為,并不關(guān)注這些行為的細(xì)節(jié)是什么鬼贱。

我們說的Objective-C是動(dòng)態(tài)運(yùn)行時(shí)語言是什么意思? (When we call objective c is runtime language what does it mean?)

  • 主要是將數(shù)據(jù)類型的確定由編譯時(shí),推遲到了運(yùn)行時(shí)移怯。這個(gè)問題其實(shí)淺涉及到兩個(gè)概念,運(yùn)行時(shí)和多態(tài)。

  • 簡(jiǎn)單來說, 運(yùn)行時(shí)機(jī)制使我們直到運(yùn)行時(shí)才去決定一個(gè)對(duì)象的類別,以及調(diào)用該類別對(duì)象指定方法这难。

  • 多態(tài):不同對(duì)象以自己的方式響應(yīng)相同的消息的能力叫做多態(tài)舟误。

  • 意思就是假設(shè)生物類(life)都擁有一個(gè)相同的方法-eat;那人類屬于生物,豬也屬于生物,都繼承了life后,實(shí)現(xiàn)各自的eat,但是調(diào)用是我們只需調(diào)用各自的eat方法。也就是不同的對(duì)象以自己的方式響應(yīng)了相同的消 息(響應(yīng)了eat這個(gè)選擇器)姻乓。因此也可以說,運(yùn)行時(shí)機(jī)制是多態(tài)的基礎(chǔ).

readwrite, readonly, assign, retain, copy, nonatomic屬性的作用?

  • readwrite 是可讀可寫特性;需要生成getter方法和setter方法;
  • readonly 是只讀特性 只會(huì)生成getter方法 不會(huì)生成setter方法 ,不希望屬性在類外改變;
  • assign 是賦值特性,setter方法將傳入?yún)?shù)賦值給實(shí)例變量;僅設(shè)置變量時(shí); assign用于簡(jiǎn)單數(shù)據(jù)類型,如NSInteger,double,bool;
  • retain 表示持有特性,setter方法將傳入?yún)?shù)先保留,再賦值,傳入?yún)?shù)的引用計(jì)數(shù)retaincount會(huì)+1;
  • copy 表示賦值特性,setter方法將傳入對(duì)象復(fù)制一份;需要完全一份新的變量時(shí);
  • nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作;
  • atomic表示多線程安全,一般使用 nonatomic嵌溢。

簡(jiǎn)述NotificationCenter、KVC蹋岩、KVO赖草、Delegate?并說明它們之間的區(qū)別?(重點(diǎn))

  • KVO(Key-Value- Observing):一對(duì)多, 觀察者模式,鍵值觀察機(jī)制,它提供了觀察某一屬性變化的方法剪个,極大簡(jiǎn)化了代碼秧骑。

  • KVC(Key-Value-Coding):是鍵值編碼, 一個(gè)對(duì)象在調(diào)用setValue的時(shí)候,

    • 檢查是否存在相應(yīng)key的set方法扣囊,存在就調(diào)用set方法乎折。

    • set方法不存在,就查找_key的成員變量是否存在如暖,存在就直接賦值。

    • 如果_key沒找到忌堂,就查找相同名稱的key盒至,存在就賦值。

    • 如果沒有就調(diào)用valueForUndefinedkey和setValue:forUndefinedKey士修。

  • Delegate: 通常發(fā)送者和接收者的關(guān)系是直接的一對(duì)一的關(guān)系枷遂。

    • 代理的目的是改變或傳遞控制鏈。允許一個(gè)類在某些特定時(shí)刻通知到其他類棋嘲,而不需要獲取到那些類的指針酒唉。

    • 可以減少框架復(fù)雜度。消息的發(fā)送者(sender)告知接收者(receiver)某個(gè)事件將要發(fā)生沸移,delegate同意然然后發(fā)送者響應(yīng)事件痪伦,delegate機(jī)制使得接收者可以改變發(fā)送者的行為侄榴。

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

  • 區(qū)別

    • 效率肯定是delegate比NSNotification高辉哥。
    • delegate方法比notification更加直接桦山,需要關(guān)注返回值,所以delegate方法往往包含should這個(gè)很傳神的詞醋旦。相反的恒水,notification最大的特色就是不關(guān)心結(jié)果。所以notification往往用did這個(gè)詞匯饲齐。
    • 兩個(gè)模塊之間聯(lián)系不是很緊密钉凌,就用notification傳值,例如多線程之間傳值用notificaiton箩张。
    • delegate只是一種較為簡(jiǎn)單的回調(diào)甩骏,且主要用在一個(gè)模塊中,例如底層功能完成了先慷,需要把一些值傳到上層去饮笛,就事先把上層的函數(shù)通過delegate傳到底層超歌,然后在底層call這個(gè)delegate常熙,它們都在一個(gè)模塊中冯挎,完成一個(gè)功能焕盟,例如說 NavgationController 從 B 界面到A 點(diǎn)返回按鈕 (調(diào)用popViewController方法) 可以用delegate比較好欣鳖。

懶加載(What is lazy loading ?)

  • 就是懶加載,只在用到的時(shí)候才去初始化寸宏。也可以理解成延時(shí)加載幕袱。我覺得最好也最簡(jiǎn)單的一個(gè)列子就是tableView中圖片的加載顯示了, 一個(gè)延時(shí)加載, 避免內(nèi)存過高,一個(gè)異步加載,避免線程堵塞提高用戶體驗(yàn)

OC有多繼承嗎?沒有的話可以用什么方法替代?

  • 多繼承即一個(gè)子類可以有多個(gè)父類,它繼承了多個(gè)父類的特性仪际。
  • Object-c的類沒有多繼承,只支持單繼承,如果要實(shí)現(xiàn)多繼承的話,可以通過類別和協(xié)議的方式來實(shí)現(xiàn)祝谚。
  • protocol(協(xié)議)可以實(shí)現(xiàn)多個(gè)接口,通過實(shí)現(xiàn)多個(gè)接口可以完成多繼承;
  • Category(類別)一般使用分類,用Category去重寫類的方法,僅對(duì)本Category有效,不會(huì)影響到其他類與原有類的關(guān)系宪迟。

分別描述類別(categories)和延展(extensions)是什么?以及兩者的區(qū)別?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?為什么Category只能為對(duì)象添加方法,卻不能添加成員變量?

  • 類別: 在沒有原類.m文件的基礎(chǔ)上,給該類添加方法;
  • 延展:一種特殊形式的類別,主要在一個(gè)類的.m文件里聲明和實(shí)現(xiàn)延展的作用,就是給某類添加私有方法或是私有變量。
  • 兩個(gè)的區(qū)別:
    • 延展可以添加屬性并且它添加的方法是必須要實(shí)現(xiàn)的交惯。延展可以認(rèn)為是一個(gè)私有的類目次泽。
    • 類別可以在不知道,不改變?cè)瓉泶a的情況下往里面添加新的方法,只能添加,不能刪除修改。
    • 并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法,因?yàn)轭悇e具有更高的優(yōu)先級(jí)席爽。
  • 繼承可以增加意荤,修改刪除方法,添加屬性只锻。
  • Category只能為對(duì)象添加方法,卻不能添加成員變量的原因:如果可以添加成員變量,添加的成員變量沒有辦法初始化

Objective-C有私有方法么?私有變量呢?如多沒有的話,有沒有什么代替的方法?

  • objective-c類里面的方法只有兩種,靜態(tài)方法和實(shí)例方法.但是可以通過把方法的聲明和定義都放在.m文件中來實(shí)現(xiàn)一個(gè)表面上的私有方法玖像。有私有變量,可以通過@private來修飾,或者把聲明放到.m文件中。在Objective‐C中,所有實(shí)例變量默認(rèn)都是私有的, 所有實(shí)例方法默認(rèn)都是公有的

include與#import的區(qū)別? #import與@class的區(qū)別?

  • import指令是Object-C針對(duì)#include的改進(jìn)版本齐饮,#import確保引用的文件只會(huì)被引用一次捐寥,這樣你就不會(huì)陷入遞歸包含的問題中笤昨。

  • import與@class二者的區(qū)別在于:

    • import會(huì)鏈入該頭文件的全部信息,包括實(shí)例變量和方法等上真;而@class只是告訴編譯器咬腋,其后面聲明的名稱是類的名稱,至于這些類是如何定義的睡互,暫時(shí)不用考慮根竿。

    • 在頭文件中一般使用@class來聲明這個(gè)名稱是類的名稱,不需要知道其內(nèi)部的實(shí)體變量和方法.
    • 而在實(shí)現(xiàn)類里面,因?yàn)闀?huì)用到這個(gè)引用類的內(nèi)部的實(shí)體變量和方法就珠,所以需要使用#import來包含這個(gè)被引用類的頭文件寇壳。
    • 在編譯效率方面,如果你有100個(gè)頭文件都#import了同一個(gè)頭文件妻怎,或者這些文件是依次引用的壳炎,如A–>B, B–>C, C–>D這樣的引用關(guān)系。當(dāng)最開始的那個(gè)頭文件有變化的話逼侦,后面所有引用它的類都需要重新編譯匿辩,如果你的類有很多的話,這將耗費(fèi)大量的時(shí)間榛丢。而是用@class則不會(huì)铲球。
    • 如果有循環(huán)依賴關(guān)系,如:A–>B, B–>A這樣的相互依賴關(guān)系晰赞,如果使用#import來相互包含稼病,那么就會(huì)出現(xiàn)編譯錯(cuò)誤,如果使用@class在兩個(gè)類的頭文件中相互聲明掖鱼,則不會(huì)有編譯錯(cuò)誤出現(xiàn)然走。

淺復(fù)制(拷貝)和深復(fù)制的區(qū)別? (Difference between shallow copy and deep copy?)

  • 淺復(fù)制(copy):只復(fù)制指向?qū)ο蟮闹羔槪粡?fù)制引用對(duì)象本身戏挡。

  • 深復(fù)制(mutableCopy):復(fù)制引用對(duì)象本身芍瑞。深復(fù)制就好理解了,內(nèi)存中存在了兩份獨(dú)立對(duì)象本身, 當(dāng)修改A時(shí),A_copy不變。

類變量的@protected,@private,@public,@package聲明各有什么含義?

變量的作用域不同褐墅。

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

Objective-C與C掌栅、C+++之間的聯(lián)系和區(qū)別秩仆?

  • Objective-C和C++都是C的面向?qū)ο蟮某?/li>
  • Object與C++的區(qū)別主要點(diǎn):Objective-C是完全動(dòng)態(tài)的码泛,支持在運(yùn)行時(shí)動(dòng)態(tài)類型決議(dynamic typing)猾封,動(dòng)態(tài)綁定(dynamic binding)以及動(dòng)態(tài)裝載(dynamic loading);而C++是部分動(dòng)態(tài)的噪珊,編譯時(shí)靜態(tài)綁定晌缘,通過嵌入類(多重繼承)和虛函數(shù)(虛表)來模擬實(shí)現(xiàn)齐莲。
  • Objective-C 在語言層次上支持動(dòng)態(tài)消息轉(zhuǎn)發(fā),其消息發(fā)送語法為 [object function]磷箕; 而且C++ 為 object->function()选酗。 兩者的語義也不同,在 Objective-C 里是說發(fā)送消息到一個(gè)對(duì)象上岳枷,至于這個(gè)對(duì)象能不能響應(yīng)消息以及是響應(yīng)還是轉(zhuǎn)發(fā)消息都不會(huì) crash芒填; 而在 C++ 里是說對(duì)象進(jìn)行了某個(gè)操作,如果對(duì)象沒有這個(gè)操作的話空繁,要么編譯會(huì)報(bào)錯(cuò)(靜態(tài)綁定)殿衰,要么程序會(huì) crash 掉的(動(dòng)態(tài)綁定)。

目標(biāo)-動(dòng)作機(jī)制

  • 目標(biāo)是動(dòng)作消息的接收者盛泡。一個(gè)控件闷祥,或者更為常見的是它的單元,以插座變量的形式保有其動(dòng)作消息的目標(biāo)傲诵。
  • 動(dòng)作是控件發(fā)送給目標(biāo)的消息凯砍,或者從目標(biāo)的角度看,它是目標(biāo)為了響應(yīng)動(dòng)作而實(shí)現(xiàn)的方法. 程序需要某些機(jī)制來進(jìn)行事件和指令的翻譯拴竹。這個(gè)機(jī)制就是目標(biāo)-動(dòng)作機(jī)制悟衩。

Objective-C優(yōu)點(diǎn)和缺點(diǎn)

  • 優(yōu)點(diǎn):1.Cateogies 2.Posing 3.動(dòng)態(tài)識(shí)別 4.指標(biāo)計(jì)算 5.彈性訊息傳遞 6.不是一個(gè)過度復(fù)雜的C衍生語言 7.Objective-C與C++可混合編程

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

C語言的函數(shù)調(diào)用和oc的消息機(jī)制有什么區(qū)別?

  • 對(duì)于C語言局待,函數(shù)的調(diào)用在編譯的時(shí)候會(huì)決定調(diào)用哪個(gè)函數(shù)。編譯完成之后直接順序執(zhí)行菱属。
  • OC的函數(shù)調(diào)用成為消息發(fā)送钳榨。屬于動(dòng)態(tài)調(diào)用過程。在編譯的時(shí)候并不能決定真正調(diào)用哪個(gè)函數(shù)(事實(shí)證明纽门,在編譯階段薛耻,OC可以調(diào)用任何函數(shù),即使這個(gè)函數(shù)并未實(shí)現(xiàn)赏陵,只要申明過就不會(huì)報(bào)錯(cuò)饼齿。而C語言在編譯階段就會(huì)報(bào)錯(cuò))。只有在真正運(yùn)行的時(shí)候才會(huì)根據(jù)函數(shù)的名稱找到對(duì)應(yīng)的函數(shù)來調(diào)用蝙搔。

什么是謂詞

謂詞就是通過NSPredicate給定的邏輯條件作為約束條件缕溉,完成對(duì)數(shù)據(jù)的篩選。

//定義謂詞對(duì)象吃型,謂詞對(duì)象中包含了過濾條件

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<%d",30];

//使用謂詞條件過濾數(shù)組中的元素证鸥,過濾之后返回查詢的結(jié)果

NSArray *array = [persons filteredArrayUsingPredicate:predicate];

//可以使用&&進(jìn)行多條件過濾

predicate = [NSPredicate predicateWithFormat:@"name='1' && age>40"];

array = [persons filteredArrayUsingPredicate:predicate];

//包含語句的使用

predicate = [NSPredicate predicateWithFormat:@"self.name IN {'1','2','4'} || self.age IN{30,40}"];

//指定字符開頭和指定字符結(jié)尾,是否包含指定字符

//name以a開頭的

predicate = [NSPredicate predicateWithFormat:@"name BEGINSWITH 'a'"];

//name以ba結(jié)尾的

predicate = [NSPredicate predicateWithFormat:@"name ENDSWITH 'ba'"];

//name中包含字符a的

predicate = [NSPredicate predicateWithFormat:@"name CONTAINS 'a'"];

//like進(jìn)行匹配多個(gè)字符

//name中只要有s字符就滿足條件

predicate = [NSPredicate predicateWithFormat:@"name like 's'"];

//?代表一個(gè)字符,下面的查詢條件是:name中第二個(gè)字符是s的

predicate = [NSPredicate predicateWithFormat:@"name like '?s'"];

C與OC混用

處理.m可以識(shí)別c和oc枉层,.mm可以識(shí)別c c++ oc 但是cpp只能用c/c++

atomic和nonatomic的區(qū)別

  • atomic提供多線程安全泉褐,防止讀寫未完成的時(shí)候被另外一個(gè)線程讀寫,造成數(shù)據(jù)錯(cuò)誤鸟蜡。
  • nonatomic在自己管理內(nèi)存的環(huán)境中膜赃,解析的訪問器保留并自動(dòng)釋放返回值,若指定了nonatomic揉忘,那么訪問器只是簡(jiǎn)單的返回這個(gè)值跳座。

常見的oc數(shù)據(jù)類型哪些,和c的基本類型有啥區(qū)別

  • 常見的: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都是指針類型的對(duì)象泣矛,在堆中分配內(nèi)存躺坟,c語言中的char int 等都是在棧中分配空間

id和nil代表什么

  • id類型的指針可以指向任何OC對(duì)象
  • nil代表空值(空指針的值,0)

nil和NULL的區(qū)別乳蓄?

  • 從oc的官方語法上看咪橙,nil表示對(duì)象的指針 即對(duì)象的引用為空
  • null表示指向基礎(chǔ)數(shù)據(jù)類型變量 即c語言變量的指針為空
  • 在非arc中 兩個(gè)空可以互換,但是在arc中 普通指針和對(duì)象引用被嚴(yán)格限制虚倒,不能互換

nil美侦、Nil、NULL和NSNull區(qū)別

  • nil和C語言的NULL相同魂奥,在objc/objc.h中定義菠剩。nil表示Objective-C對(duì)象的值為空。在C語言中耻煤,指針的空值用NULL表示具壮。在Objective-C中,nil對(duì)象調(diào)用任何方法表示什么也不執(zhí)行哈蝇,也不會(huì)崩潰棺妓。
  • Nil:那么對(duì)于我們Objective-C開發(fā)來說,Nil也就代表((void *)0)炮赦。但是它是用于代表空類的. 比如:Class myClass = Nil;
  • NULL: 在C語言中怜跑,NULL是無類型的,只是一個(gè)宏吠勘,它代表空. 這就是在C/C++中的空指針性芬。對(duì)于我們Objective-C開發(fā)來說,NULL就表示((void*)0).
  • NSNull:NSNull是繼承于NSObject的類型剧防。它是很特殊的類植锉,它表示是空,什么也不存儲(chǔ)峭拘,但是它卻是對(duì)象俊庇,只是一個(gè)占位對(duì)象搏熄。使用場(chǎng)景就不一樣了,比如說服務(wù)端接口中讓我們?cè)谥禐榭諘r(shí)暇赤,傳空。NSDictionry *parameters = @{@"arg1" : @"value1",@"arg2" : arg2.isEmpty ? [NSNull null] : arg2};

  • NULL宵凌、nil鞋囊、Nil這三者對(duì)于Objective-C中值是一樣的,都是(void *)0瞎惫,那么為什么要區(qū)分呢溜腐?又與NSNull之間有什么區(qū)別:

  • NULL是宏,是對(duì)于C語言指針而使用的瓜喇,表示空指針

  • nil是宏挺益,是對(duì)于Objective-C中的對(duì)象而使用的,表示對(duì)象為空

  • Nil是宏乘寒,是對(duì)于Objective-C中的類而使用的望众,表示類指向空

  • NSNull是類類型,是用于表示空的占位對(duì)象伞辛,與JS或者服務(wù)端的null類似的含意

向一個(gè)nil對(duì)象發(fā)送消息會(huì)發(fā)生什么烂翰?

  • 向nil發(fā)送消息是完全有效的——只是在運(yùn)行時(shí)不會(huì)有任何作用。

  • 如果一個(gè)方法返回值是一個(gè)對(duì)象蚤氏,那么發(fā)送給nil的消息將返回0(nil)

  • 如果方法返回值為指針類型甘耿,其指針大小為小于或者等于sizeof(void*),float竿滨,double佳恬,long double 或者long long的整型標(biāo)量,發(fā)送給nil的消息將返回0于游。

-如果方法返回值為結(jié)構(gòu)體毁葱,正如在《Mac OS X ABI 函數(shù)調(diào)用指南》,發(fā)送給nil的消息將返回0贰剥。結(jié)構(gòu)體中各個(gè)字段的值將都是0头谜。其他的結(jié)構(gòu)體數(shù)據(jù)類型將不是用0填充的。

  • 如果方法的返回值不是上述提到的幾種情況鸠澈,那么發(fā)送給nil的消息的返回值將是未定義的柱告。

self.和self->的區(qū)別

  • self.是調(diào)用get或者set方法
  • self是當(dāng)前本身,是一個(gè)指向當(dāng)前對(duì)象的指針
  • self->是直接訪問成員變量

類方法和實(shí)例方法的本質(zhì)區(qū)別和聯(lián)系

類方法 實(shí)例方法
屬于類對(duì)象 屬于實(shí)例對(duì)象
只能類對(duì)象調(diào)用 實(shí)例對(duì)象調(diào)用
self是類對(duì)象 self是實(shí)例對(duì)象
類方法可以調(diào)用其他類方法 實(shí)例方法可以調(diào)用實(shí)例方法
類方法不能訪問成員變量 實(shí)例方法可以訪問成員變量
類方法不能直接調(diào)用對(duì)象方法 實(shí)例方法可以調(diào)用類方法

_block/weak修飾符區(qū)別

  • _block在arc和mrc環(huán)境下都能用笑陈,可以修飾對(duì)象际度,也能修飾基本數(shù)據(jù)類型
  • _weak只能在arc環(huán)境下使用,只能修飾對(duì)象(NSString)涵妥,不能修飾基本數(shù)據(jù)類型(int)
  • _block對(duì)象可以在block中重新賦值乖菱,_weak不行。

寫一個(gè)NSString類的實(shí)現(xiàn)

NSString *str = [[NSString alloc]initWithCString:nullTerminatedCString encoding:encoding];

為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)?

ifndef __INCvxWorksh

define __INCvxWorksh

ifdef __cplusplus

extern "C" {

endif

ifdef __cplusplus

}

endif

endif

顯然窒所,頭文件中的編譯宏“#ifndef __INCvxWorksh鹉勒、#define __INCvxWorksh、#endif” 的作用是防止該頭文件被重復(fù)引用

init和initwithobject區(qū)別(語法)吵取?
  • 后者給屬性賦值

@property的本質(zhì)是什么禽额?ivar、getter皮官、setter是如何生成并添加到這個(gè)類中的脯倒?

@property的本質(zhì):
@property = ivar(實(shí)例變量) + getter(取方法) + setter(存方法)
“屬性” (property)有兩大概念:ivar(實(shí)例變量)、存取方法(access method = getter + setter)
ivar捺氢、getter藻丢、setter如何生成并添加到類中:
這是編譯器自動(dòng)合成的,通過@synthesize關(guān)鍵字指定摄乒,若不指定悠反,默認(rèn)為@synthesize propertyName = _propertyName;若手動(dòng)實(shí)現(xiàn)了getter/setter方法,則不會(huì)自動(dòng)合成馍佑。
現(xiàn)在編譯器已經(jīng)默認(rèn)為我們添加@synthesize propertyName = _propertyName;因此不再需要手動(dòng)添加了问慎,除非你真的要改成員變量名。
生成getter方法時(shí)挤茄,會(huì)判斷當(dāng)前屬性名是否有_如叼,比如聲明屬性為@property (nonatomic, copy) NSString *_name;那么所生成的成員變量名就會(huì)變成__name,如果我們要手動(dòng)生成getter方法穷劈,就要判斷是否以_開頭了笼恰。
不過,命名都要有規(guī)范歇终,是不允許聲明屬性是使用_開頭的社证,不規(guī)范的命名,在使用runtime時(shí)评凝,會(huì)帶來很多的不方便的追葡。

這個(gè)寫法會(huì)出什么問題:@property (copy) NSMutableArray *array;

  • 沒有指明為nonatomic,因此就是atomic原子操作奕短,會(huì)影響性能宜肉。該屬性使用了同步鎖,會(huì)在創(chuàng)建時(shí)生成一些額外的代碼用于幫助編寫多線程程序翎碑,這會(huì)帶來性能問題谬返,通過聲明nonatomic可以節(jié)省這些雖然很小但是不必要額外開銷。在我們的應(yīng)用程序中日杈,幾乎都是使用nonatomic來聲明的遣铝,因?yàn)槭褂胊tomic并不能保證絕對(duì)的線程安全佑刷,對(duì)于要絕對(duì)保證線程安全的操作,還需要使用更高級(jí)的方式來處理酿炸,比如NSSpinLock瘫絮、@syncronized等
  • 因?yàn)槭褂玫氖莄opy,所得到的實(shí)際是NSArray類型填硕,它是不可變的麦萤,若在使用中使用了增、刪廷支、改操作,則會(huì)crash

@protocol和category中如何使用 @property

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

@property中有哪些屬性關(guān)鍵字藕甩?

  1. 原子性 (atomic施敢,nonatomic)

  2. 讀寫(readwrite, readonly)

  3. 內(nèi)存管理(assign, strong, weak, unsafe_unretained,copy)

  4. getter、setter

isa指針問題

  • isa:是一個(gè)Class 類型的指針. 每個(gè)實(shí)例對(duì)象有個(gè)isa的指針,他指向?qū)ο蟮念愊晾常鳦lass里也有個(gè)isa的指針, 指向meteClass(元類)僵娃。元類保存了類方法的列表。當(dāng)類方法被調(diào)用時(shí)腋妙,先會(huì)從本身查找類方法的實(shí)現(xiàn)默怨,如果沒有,元類會(huì)向他父類查找該方法骤素。同時(shí)注意的是:元類(meteClass)也是類匙睹,它也是對(duì)象。元類也有isa指針,它的isa指針最終指向的是一個(gè)根元類(root meteClass).根元類的isa指針指向本身济竹,這樣形成了一個(gè)封閉的內(nèi)循環(huán)痕檬。

如何訪問并修改一個(gè)類的私有屬性?

  • 一種是通過KVC獲取
  • 通過runtime訪問并修改私有屬性

如何為 Class 定義一個(gè)對(duì)外只讀對(duì)內(nèi)可讀寫的屬性?

在頭文件中將屬性定義為readonly,在.m文件中將屬性重新定義為readwrite

Objective-C 中送浊,meta-class 指的是什么梦谜?

meta-class 是 Class 對(duì)象的類,為這個(gè)Class類存儲(chǔ)類方法,當(dāng)一個(gè)類發(fā)送消息時(shí),就去這個(gè)類對(duì)應(yīng)的meta-class中查找那個(gè)消息,每個(gè)Class都有不同的meta-class,所有的meta-class都使用基類的meta-class(假如類繼承NSObject,那么他所對(duì)應(yīng)的meta-class也是NSObject)作為他們的類

Objective-C 的class是如何實(shí)現(xiàn)的?Selector是如何被轉(zhuǎn)化為 C 語言的函數(shù)調(diào)用的袭景?

  • 當(dāng)一個(gè)類被正確的編譯過后唁桩,在這個(gè)編譯成功的類里面,存在一個(gè)變量用于保存這個(gè)類的信息耸棒。我們可以通過[NSClassFromString]或[obj class]朵夏。這樣的機(jī)制允許我們?cè)诔绦驁?zhí)行的過程當(dāng)中,可以Class來得到對(duì)象的類榆纽,也可以在程序執(zhí)行的階段動(dòng)態(tài)的生成一個(gè)在編譯階段無法確定的一個(gè)對(duì)象仰猖。 (isa指針)
  • @selector()基本可以等同C語言的中函數(shù)指針,只不過C語言中捏肢,可以把函數(shù)名直接賦給一個(gè)函數(shù)指針,而Object-C的類不能直接應(yīng)用函數(shù)指針饥侵,這樣只能做一個(gè)@selector語法來取.

    @interface foo
    -(int)add:int val;
    @end
    
    SEL class_func ; //定義一個(gè)類方法指針
    class_func = @selector(add:int);
    
  • @selector是查找當(dāng)前類的方法鸵赫,而[object @selector(方法名:方法參數(shù)..) ] ;是取object對(duì)應(yīng)類的相應(yīng)方法.

  • 查找類方法時(shí),除了方法名,方法參數(shù)也查詢條件之一.

  • 可以用字符串來找方法 SEL 變量名 = NSSelectorFromString(方法名字的字符串);

  • 可以運(yùn)行中用SEL變量反向查出方法名字字符串躏升。NSString *變量名 = NSStringFromSelector(SEL參數(shù));

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

對(duì)于語句NSString *obj = [[NSData alloc] init]; 膨疏,編譯時(shí)和運(yùn)行時(shí)obj分別是什么類型一睁?

  • 編譯時(shí)是NSString類型 ,運(yùn)行時(shí)是NSData類型.

@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)綁定怀愧。

NSString 的時(shí)候用copy和strong的區(qū)別?

OC中NSString為不可變字符串的時(shí)候余赢,用copy和strong都是只分配一次內(nèi)存芯义,但是如果用copy的時(shí)候,需要先判斷字符串是否是不可變字符串妻柒,如果是不可變字符串扛拨,就不再分配空間,如果是可變字符串才分配空間举塔。如果程序中用到NSString的地方特別多绑警,每一次都要先進(jìn)行判斷就會(huì)耗費(fèi)性能求泰,影響用戶體驗(yàn),用strong就不會(huì)再進(jìn)行判斷计盒,所以渴频,不可變字符串可以直接用strong。

NSArray北启、NSSet卜朗、NSDictionary與NSMutableArray、NSMutableSet咕村、NSMutableDictionary的特性和作用(遇到copy修飾產(chǎn)生的變化)

  • 特性:
  • NSArray表示不可變數(shù)組场钉,是有序元素集,只能存儲(chǔ)對(duì)象類型懈涛,可通過索引直接訪問元素逛万,而且元素類型可以不一樣,但是不能進(jìn)行增肩钠、刪泣港、改操作暂殖;NSMutableArray是可變數(shù)組价匠,能進(jìn)行增、刪呛每、改操作踩窖。通過索引查詢值很快,但是插入晨横、刪除等效率很低洋腮。
  • NSSet表示不可變集合,具有確定性手形、互異性啥供、無序性的特點(diǎn),只能訪問而不能修改集合库糠;NSMutableSet表示可變集合伙狐,可以對(duì)集合進(jìn)行增、刪瞬欧、改操作贷屎。集合通過值查詢很快,插入艘虎、刪除操作極快唉侄。
  • NSDictionary表示不可變字典,具有無序性的特點(diǎn)野建,每個(gè)key對(duì)應(yīng)的值是唯一的属划,可通過key直接獲取值恬叹;NSMutableDictionary表示可變字典,能對(duì)字典進(jìn)行增榴嗅、刪妄呕、改操作。通過key查詢值嗽测、插入绪励、刪除值都很快。
  • 作用:
  • 數(shù)組用于處理一組有序的數(shù)據(jù)集唠粥,比如常用的列表的dataSource要求有序疏魏,可通過索引直接訪問,效率高晤愧。
  • 集合要求具有確定性大莫、互異性、無序性官份,在iOS開發(fā)中是比較少使用到的只厘,筆者也不清楚如何說明其作用
  • 字典是鍵值對(duì)數(shù)據(jù)集,操作字典效率極高舅巷,時(shí)間復(fù)雜度為常量羔味,但是值是無序的。在ios中钠右,常見的JSON轉(zhuǎn)字典赋元,字典轉(zhuǎn)模型就是其中一種應(yīng)用。

請(qǐng)把字符串2015-04-10格式化日期轉(zhuǎn)為NSDate類型

NSString *timeStr = @"2015-04-10";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
formatter.timeZone = [NSTimeZone defaultTimeZone];
NSDate *date = [formatter dateFromString:timeStr];
// 2015-04-09 16:00:00 +0000
NSLog(@"%@", date);

在一個(gè)對(duì)象的方法里:self.name=@object;和name=@object有什么不同

  • 這是老生常談的話題了飒房,實(shí)質(zhì)上就是問setter方法賦值與成員變量賦值有什么不同搁凸。通過點(diǎn)語法self.name實(shí)質(zhì)上就是[self setName:@object];。而name這里是成員變量狠毯,直接賦值护糖。
    一般來說,在對(duì)象的方法里成員變量和方法都是可以訪問的嚼松,我們通常會(huì)重寫Setter方法來執(zhí)行某些額外的工作嫡良。比如說,外部傳一個(gè)模型過來惜颇,那么我會(huì)直接重寫Setter方法皆刺,當(dāng)模型傳過來時(shí),也就是意味著數(shù)據(jù)發(fā)生了變化凌摄,那么視圖也需要更新顯示羡蛾,則在賦值新模型的同時(shí)也去刷新UI。這樣也不用再額外提供其他方法了锨亏。

怎樣使用performSelector傳入3個(gè)以上參數(shù)痴怨,其中一個(gè)為結(jié)構(gòu)體

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

因?yàn)橄到y(tǒng)提供的performSelector的api中忙干,并沒有提供三個(gè)參數(shù)。因此浪藻,我們只能傳數(shù)組或者字典捐迫,但是數(shù)組或者字典只有存入對(duì)象類型,而結(jié)構(gòu)體并不是對(duì)象類型爱葵,那么怎么辦呢施戴?
沒有辦法,我們只能通過對(duì)象放入結(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)存萌丈,我們要手動(dòng)釋放掉
- (void)dealloc {
  free(self.arg3);
}
 
@end

測(cè)試:

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í)得到正確的數(shù)據(jù)的
- (void)call:(HYBObject *)obj {
    NSLog(@"%d %d", obj.arg3->a, obj.arg3->b);
}

objc中向一個(gè)對(duì)象發(fā)送消息[obj foo]和objc_msgSend()函數(shù)之間有什么關(guān)系赞哗?

實(shí)際上,編譯器在編譯時(shí)會(huì)轉(zhuǎn)換成objc_msgSend辆雾,大概會(huì)像這樣:
((void (*)(id, SEL))(void)objc_msgSend)((id)obj, sel_registerName("foo"));
也就是說肪笋,[obj foo];在objc動(dòng)態(tài)編譯時(shí),會(huì)被轉(zhuǎn)換為:objc_msgSend(obj, @selector(foo));這樣的形式度迂,但是需要根據(jù)具體的參數(shù)類型及返回值類型進(jìn)行相應(yīng)的類型轉(zhuǎn)換藤乙。

下面的代碼輸出什么?


@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
這個(gè)題目主要是考察關(guān)于Objective-C中對(duì)self和super的理解惭墓。我們都知道:self是類的隱藏參數(shù)坛梁,指向當(dāng)前調(diào)用方法的這個(gè)類的實(shí)例。那super呢诅妹?
很多人會(huì)想當(dāng)然的認(rèn)為“super和self類似罚勾,應(yīng)該是指向父類的指針吧毅人!”吭狡。這是很普遍的一個(gè)誤區(qū)。其實(shí) super是一個(gè) Magic Keyword丈莺,它本質(zhì)是一個(gè)編譯器標(biāo)示符划煮,和self 是指向的同一個(gè)消息接受者!他們兩個(gè)的不同點(diǎn)在于:super會(huì)告訴編譯器缔俄,調(diào)用class 這個(gè)方法時(shí)弛秋,要去父類的方法,而不是本類里的俐载。
上面的例子不管調(diào)用[self class]還是[super class]蟹略,接受消息的對(duì)象都是當(dāng)前 Son *xxx 這個(gè)對(duì)象。
當(dāng)使用self調(diào)用方法時(shí)遏佣,會(huì)從當(dāng)前類的方法列表中開始找挖炬,如果沒有,就從父類中再找状婶;而當(dāng)使用super時(shí)意敛,則從父類的方法列表中開始找馅巷。然后調(diào)用父類的這個(gè)方法。

若一個(gè)類有實(shí)例變量NSString *_foo草姻,調(diào)用setValue:forKey:時(shí)钓猬,可以以foo還是_foo作為key?

  • 兩者都可以撩独。

什么時(shí)候使用NSMutableArray敞曹,什么時(shí)候使用NSArray?

  • 當(dāng)數(shù)組在程序運(yùn)行時(shí),需要不斷變化的综膀,使用NSMutableArray异雁,當(dāng)數(shù)組在初始化后,便不再改變的僧须,使用NSArray纲刀。需要指出的是,使用NSArray只表明的是該數(shù)組在運(yùn)行時(shí)不發(fā)生改變担平,即不能往NSAarry的數(shù)組里新增和刪除元素示绊,但不表明其數(shù)組內(nèi)的元素的內(nèi)容不能發(fā)生改變。NSArray是線程安全的暂论,NSMutableArray不是線程安全的面褐,多線程使用到NSMutableArray需要注意。

類NSObject的那些方法經(jīng)常被使用?

  • NSObject是Objetive-C的基類取胎,其由NSObject類及一系列協(xié)議構(gòu)成展哭。
  • 其中類方法alloc、class闻蛀、 description 對(duì)象方法init匪傍、dealloc、– performSelector:withObject:afterDelay:等經(jīng)常被使用

什么是簡(jiǎn)便構(gòu)造方法?

  • 簡(jiǎn)便構(gòu)造方法一般由CocoaTouch框架提供觉痛,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
  • Foundation下大部分類均有簡(jiǎn)便構(gòu)造方法役衡,我們可以通過簡(jiǎn)便構(gòu)造方法,獲得系統(tǒng)給我們創(chuàng)建好的對(duì)象薪棒,并且不需要手動(dòng)釋放手蝎。

什么是構(gòu)造方法,使用構(gòu)造方法有什么注意點(diǎn)俐芯。

什么是構(gòu)造方法:構(gòu)造方法是對(duì)象初始化并一個(gè)實(shí)例的方法棵介。

構(gòu)造方法有什么用: 一般在構(gòu)造方法里 對(duì)類進(jìn)行一些初始化操作
注意點(diǎn):方法開頭必須以init開頭,接下來名稱要大寫 例如 initWithName 吧史,initLayout

創(chuàng)建一個(gè)對(duì)象需要經(jīng)過那三個(gè)步驟邮辽?

  • 開辟內(nèi)存空間
  • 初始化參數(shù)
  • 返回內(nèi)存地址值

Get方法的作用是什么?

Get方法的作用:為調(diào)用者返回對(duì)象內(nèi)部的成員變量

Set方法的作用是什么?Set方法的好處逆巍?

  • Set方法的作用:為外界提供一個(gè)設(shè)置成員變量值的方法及塘。
  • Set方法的好處:
    • 不讓數(shù)據(jù)暴露在外,保證了數(shù)據(jù)的安全性
    • 對(duì)設(shè)置的數(shù)據(jù)進(jìn)行過濾

結(jié)構(gòu)體當(dāng)中能定義oc對(duì)象嗎锐极?

不能, 因?yàn)榻Y(jié)構(gòu)體當(dāng)中只能是類型的聲明不能進(jìn)行分配空間

點(diǎn)語法本質(zhì)是什么,寫一個(gè)點(diǎn)語法的例子,并寫上注釋

  • 點(diǎn)語法的本質(zhì)是方法的調(diào)用聋丝,而不是訪問成員變量敌蚜,當(dāng)使用點(diǎn)語法時(shí)碗脊,編譯器會(huì)自動(dòng)展開成相應(yīng)的方法奴艾。切記點(diǎn)語法的本質(zhì)是轉(zhuǎn)換成相應(yīng)的set和get方法,如果沒有set和get方法翎迁,則不能使用點(diǎn)語法栋猖。
  • 例如有一個(gè)Person類 通過@property定義了name和age屬性,再提供了一個(gè)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方法

id類型是什么汪榔,instancetype是什么蒲拉,有什么區(qū)別?

  • id類型:萬能指針痴腌,能作為參數(shù)雌团,方法的返回類型。
  • instancetype:只能作為方法的范圍類型士聪,并且返回的類型是當(dāng)前定義類的類類型锦援。

成員變量名的命名以下劃線開頭的好處?

  • 與get方法的方法名區(qū)分開來剥悟;
  • 可以和一些其他的局部變量區(qū)分開來灵寺,下劃線開頭的變量,通常都是類的成員變量区岗。

這段代碼有什么問題嗎:

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

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

   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]);
}

寫一個(gè)完整的代理,包括聲明,實(shí)現(xiàn)

//創(chuàng)建
@protocol MyDelagate
@required
-(void)eat:(NSString *)foodName;
@optional
-(void)run;
@end

//聲明
@interface person: NSObject< MyDelagate>

//實(shí)現(xiàn)
@implementation person
-(void)eat:(NSString *)foodName;
{ NSLog(@"吃:%@!",foodName);}
-(void)run
{ NSLog(@"run!");}
@end

isKindOfClass、isMemberOfClass躏尉、selector作用分別是什么

  • isKindOfClass,作用是,某個(gè)對(duì)象屬于某個(gè)類型或者繼承自某類型

  • isMemberOfClass:某個(gè)對(duì)象確切屬于某個(gè)類型

  • selector:通過方法名,獲取在內(nèi)存中的函數(shù)的入口地址

請(qǐng)分別寫出SEL蚯根、id后众、@的意思?

  • SEL是“selector”的一個(gè)類型,表示一個(gè)方法的名字-------就是一個(gè)方法的入口地址

  • id是一個(gè)指向任何一個(gè)繼承了Object(或者NSObject)類的對(duì)象胀糜。需要注意的是id是一個(gè)指針,所以在使用id 的時(shí)候不需要加*。

  • @:OC中的指令符

unsigned int 和int 有什么區(qū)別蒂誉。假設(shè)int長(zhǎng)度為65535教藻,請(qǐng)寫出unsigned int與 int的取值范圍

int:基本整型,當(dāng)字節(jié)數(shù)為2時(shí) 取值范圍為-32768~32767右锨,當(dāng)字節(jié)數(shù)為4時(shí) 取值范圍
負(fù)的2的31次方 到 2的31次方減1
unsigned int:無符號(hào)基本整型括堤,當(dāng)字節(jié)數(shù)為2時(shí) 取值范圍為0~65535,當(dāng)字節(jié)數(shù)為4時(shí) 取值范圍為0到2的32次方減1

Foundation對(duì)象與Core Foundation對(duì)象有什么區(qū)別

  • Foundation對(duì)象是OC的,Core Foundation對(duì)象是C對(duì)象
  • 數(shù)據(jù)類型之間的轉(zhuǎn)換
    • ARC:__bridge_retained(持有對(duì)象所有權(quán),F->CF)悄窃、__bridge_transfer(釋放對(duì)象有所權(quán)CF->F)
    • 非ARC: __bridge

編寫一個(gè)函數(shù)讥电,實(shí)現(xiàn)遞歸刪除指定路徑下的所有文件。

+ (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(@"你打印的是目錄或者不存在");
    }
}

文章如有問題轧抗,請(qǐng)留言恩敌,我將及時(shí)更正。

滿地打滾賣萌求贊横媚,如果本文幫助到你纠炮,輕點(diǎn)下方的紅心,給作者君增加更新的動(dòng)力灯蝴。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恢口,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子穷躁,更是在濱河造成了極大的恐慌耕肩,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件问潭,死亡現(xiàn)場(chǎng)離奇詭異看疗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)睦授,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門两芳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人去枷,你說我怎么就攤上這事怖辆。” “怎么了删顶?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵竖螃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我逗余,道長(zhǎng)特咆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任录粱,我火速辦了婚禮腻格,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啥繁。我一直安慰自己菜职,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布旗闽。 她就那樣靜靜地躺著酬核,像睡著了一般蜜另。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫡意,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天举瑰,我揣著相機(jī)與錄音,去河邊找鬼蔬螟。 笑死嘶居,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的促煮。 我是一名探鬼主播邮屁,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼菠齿!你這毒婦竟也來了佑吝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤绳匀,失蹤者是張志新(化名)和其女友劉穎芋忿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疾棵,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戈钢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了是尔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殉了。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拟枚,靈堂內(nèi)的尸體忽然破棺而出薪铜,到底是詐尸還是另有隱情,我是刑警寧澤恩溅,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布隔箍,位于F島的核電站,受9級(jí)特大地震影響脚乡,放射性物質(zhì)發(fā)生泄漏蜒滩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一奶稠、第九天 我趴在偏房一處隱蔽的房頂上張望俯艰。 院中可真熱鬧,春花似錦窒典、人聲如沸蟆炊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春劈猪,著一層夾襖步出監(jiān)牢的瞬間昧甘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工战得, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留充边,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓常侦,卻偏偏與公主長(zhǎng)得像浇冰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子聋亡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉肘习,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,681評(píng)論 0 9
  • 我們常常會(huì)聽說 Objective-C 是一門動(dòng)態(tài)語言,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢坡倔?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,176評(píng)論 0 7
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 728評(píng)論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法漂佩,類相關(guān)的語法,內(nèi)部類的語法罪塔,繼承相關(guān)的語法投蝉,異常的語法,線程的語...
    子非魚_t_閱讀 31,587評(píng)論 18 399
  • 文/雨竹 又是一年的深秋征堪,秋季本蕭瑟瘩缆,但于我來說卻是最歡喜的日子,只因我的生日就在這深秋季節(jié)佃蚜,在這個(gè)特別的日子咳榜,我...
    遼寧_雨竹閱讀 308評(píng)論 0 4