1.oc可以多繼承嗎?可以實(shí)現(xiàn)多個接口嗎适室?Category是什么?重新寫一個類的方式用繼承好還是分類好举瑰?為什么捣辆?
OC不能多繼承;可實(shí)現(xiàn)多個接口此迅,通過多個接口可以完成類似C++的多重繼承汽畴;Category是類別;一般情況用分類好邮屁,用Category去重寫類的方法整袁,僅對本Category有效,不會影響到其他類與原有類的關(guān)系佑吝。
2.#import 跟#include 又什么區(qū)別坐昙,@class呢, #import<> 跟 #import””又什么區(qū)別?
#import
是Objective-C的導(dǎo)入頭文件的關(guān)鍵字,#include
是C/C++的頭文件導(dǎo)入的關(guān)鍵字芋忿。使用#import
只會導(dǎo)入一次炸客,不會重復(fù)導(dǎo)入,相當(dāng)于#include
和#pragma once
戈钢;
@class
告訴編譯器某個類的聲明痹仙,當(dāng)執(zhí)行時,采取查看累的實(shí)現(xiàn)文件殉了,可以解決頭文件的相互包含开仰;
#import<>
用來包含系統(tǒng)的頭文件,#import “”
用來包含用戶的頭文件薪铜。
- 屬性readwrite众弓,readonly,assign隔箍,retain谓娃,copy,nonatomic 各是什么作用蜒滩,在那種情況下用?
1)readwrite:可讀可寫滨达,需要生成getter和setter方法時
2)readonly: 只讀特性,只會生成getter方法俯艰,不會生成setter方法捡遍;不希望屬性在類外改變
- assign :賦值特性,setter方法傳入?yún)?shù)賦值給實(shí)例變量竹握;僅設(shè)置變量時稽莉;
4)retain:持有特性,setter方法將傳入?yún)?shù)先保留涩搓,再賦值污秆,傳入?yún)?shù)的retainCount會 +1 - copy表示賦值特性,setter方法將傳入對象賦值一份昧甘;需要完全一份新的變量時良拼。
6)nonatomic:非原子操作,決定編譯器生成的setter getter是否是原子操作充边,atomic表示多線程安全庸推,一般使用nonatomic
注意:atomic原子操作,setter和getter是安全的話浇冰,就不必
4.寫一個setter方法用于完成@property (nonatomic,retain)NSString *name,寫一個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;
}
5.對于語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運(yùn)行時分別時什么類型的對象?
編譯的時候是NSString 類型的對象,運(yùn)行時候是NSData類型的對象
6.常見的object-c的數(shù)據(jù)類型有那些肘习, 和C的基本數(shù)據(jù)類型有什么區(qū)別?如:NSInteger和int
object-c的數(shù)據(jù)類型有NSString际乘,NSNumber,NSArray漂佩,NSMutableArray脖含,NSData等等。這些都是class投蝉。
創(chuàng)建后便是對象养葵,而C語言的基本數(shù)據(jù)類型int,只是一定字節(jié)的內(nèi)存空間瘩缆,用于存放數(shù)值;
NSInteger是基本數(shù)據(jù)類型关拒,并不是NSNumber的子類,當(dāng)然也不是NSObject的子類庸娱。
NSInteger是基本數(shù)據(jù)類型Int或者Long的別名(NSInteger的定義typedef long NSInteger)着绊,它的區(qū)別在于,NSInteger會根據(jù)系統(tǒng)是32位還是64位來決定是本身是int還是Long涌韩。
7.id 聲明的對象有什么特性?
id 聲明的對象具有運(yùn)行時的特性畔柔,即可以指向任意類型的objective-c的對象。
8.Objective-C如何對內(nèi)存管理的,說說你的看法和解決方法?
Objective-C的內(nèi)存管理主要有三種方式ARC(自動內(nèi)存計(jì)數(shù))臣樱、手動內(nèi)存計(jì)數(shù)(MRC)靶擦、內(nèi)存池。
1). (Garbage Collection)自動內(nèi)存計(jì)數(shù):這種方式和java類似雇毫,在你的程序的執(zhí)行過程中玄捕。
解決: 通過alloc – initial方式創(chuàng)建的, 創(chuàng)建后引用計(jì)數(shù)+1, 此后每retain一次引用計(jì)數(shù)+1, 那么在程序中做相應(yīng)次數(shù)的release就好了.
2) (Reference Counted)手動內(nèi)存計(jì)數(shù):就是說,從一段內(nèi)存被申請之后棚放,就存在一個變量用于保存這段內(nèi)存被使用的次數(shù)枚粘,我們暫時把它稱為計(jì)數(shù)器,當(dāng)計(jì)數(shù)器變?yōu)?的時候飘蚯,那么就是釋放這段內(nèi)存的時候馍迄。
解決:一般是由類的靜態(tài)方法創(chuàng)建的, 函數(shù)名中不會出現(xiàn)alloc或init字樣, 如[NSString string]和[NSArray arrayWithObject:], 創(chuàng)建后引用計(jì)數(shù)+0, 在函數(shù)出棧后釋放, 即相當(dāng)于一個棧上的局部變量. 當(dāng)然也可以通過retain延長對象的生存期.
3). (NSAutoRealeasePool)內(nèi)存池:可以通過創(chuàng)建和釋放內(nèi)存池控制內(nèi)存申請和回收的時機(jī).
NSAutoRealeasePool: 內(nèi)存池福也。
由autorelease加入系統(tǒng)內(nèi)存池,內(nèi)存池是可以嵌套的攀圈,每個內(nèi)存池都需要有一個創(chuàng)建釋放對象暴凑,就像main函數(shù)中寫的一樣。使用也很簡單赘来,比如:[[[NSString alloc]initialWithFormat:@”Hey you!”] autorelease],
就將一個NSString 對象加入到最內(nèi)層的系統(tǒng)內(nèi)存池现喳,當(dāng)我們釋放這個內(nèi)存池時候,其中的對象都會被釋放犬辰。
- 原子(atomic)跟非原子(non-atomic)屬性有什么區(qū)別?
1)atomic提供多線程安全嗦篱。是防止在寫未完成的時候被另外一個線程讀取,造成數(shù)據(jù)錯誤幌缝。
2). non-atomic:在自己管理內(nèi)存的環(huán)境中灸促,解析的訪問器保留并自動釋放返回的值,如果指定了 nonatomic 狮腿,那么訪問器只是簡單地返回這個值腿宰。
NSMutableArray* ary = [[NSMutableArray array] retain]; //
NSString *str = [NSString stringWithFormat:@"test"]; // +1
[str retain]; // +1
[aryaddObject:str]; // +1
NSLog(@”%@%d”,str,[str retainCount]);
[str retain]; // +1
[str release]; // -1
[str release]; // -1
NSLog(@”%@%d”,str,[str retainCount]);
[aryremoveAllObjects]; // -1
NSLog(@”%@%d”,str,[str retainCount]);
- 內(nèi)存管理的幾條原則時什么?按照默認(rèn)法則.那些關(guān)鍵字生成的對象需要手動釋放?在和property結(jié)合的時候怎樣有效的避免內(nèi)存泄露?
內(nèi)存管理原則:誰申請,誰釋放。
遵循Cocoa Touch的使用原則;
內(nèi)存管理主要避免:過早釋放和內(nèi)存泄漏缘厢。
對于過早釋放:需要注意@property設(shè)置特性時吃度,一定要用對特性相關(guān)的關(guān)鍵字。
對于內(nèi)存釋放:一定要申請了要負(fù)責(zé)釋放贴硫,一定要細(xì)心椿每。
關(guān)鍵字:alloc
和new
生成的對象需要手動釋放;
設(shè)置正確的property屬性英遭,對于retain需要在合適的地方釋放间护。
12.如果測試iOS設(shè)備的性能?
Profile-> Instrument -> Time Profier
Profile是側(cè)面挖诸,輪廓的意思汁尺。
13.OC創(chuàng)建線程的方法是什么?如果在主線程中執(zhí)行代碼多律,方法是什么痴突?如果想延時執(zhí)行代碼,方法又是什么狼荞?
創(chuàng)建方式:NSThread, GCD的dispatch,使用子類化的NSOperation.然后將其加入NSOperationQueue辽装;在主線程中執(zhí)行代碼,方法是performSelectorOnMainThread,如果想延時執(zhí)行代碼可以用performSelector:onThread:withObject:waitUniilDone
15.淺談設(shè)計(jì)模式
設(shè)計(jì)模式并不是一種新技術(shù)相味,而是一種編碼經(jīng)驗(yàn)拾积,使用比如Java中的接口,iOS中的協(xié)議,繼承關(guān)系等基本手段拓巧。用比較成熟的邏輯去處理某一類型的事情斯碌,總結(jié)為所有設(shè)計(jì)模式。面向?qū)ο缶幊讨辛嵯琂ava已經(jīng)歸納了23中設(shè)計(jì)模式输拇。
MVC設(shè)計(jì)模式:模型,視圖贤斜,控制器,可以將整個應(yīng)用程序在思想上分成三大塊逛裤,對應(yīng)是的數(shù)據(jù)的存儲或處理瘩绒,前臺的顯示,業(yè)務(wù)邏輯的控制带族。 iOS本身的設(shè)計(jì)思想就是遵循mvc設(shè)計(jì)模式锁荔。其不屬于23種設(shè)計(jì)模式范疇。
代理模式:代理模式給某一個對象提供一個代理對象蝙砌,并由代理對象控制對源對象的引用.比如一個工廠生產(chǎn)了產(chǎn)品阳堕,并不想直接賣給用戶,而是搞了很多代理商择克,用戶可以直接找代理商買東西恬总,代理商從工廠進(jìn)貨.常見的如QQ的自動回復(fù)就屬于代理攔截,代理模式在iphone中得到廣泛應(yīng)用.
單例模式:說白了就是一個類不通過alloc方式創(chuàng)建對象肚邢,而是用一個靜態(tài)方法返回這個類的對象壹堰。系統(tǒng)只需要擁有一個的全局對象,這樣有利于我們協(xié)調(diào)系統(tǒng)整體的行為骡湖,比如想獲得[UIApplication sharedApplication];任何地方調(diào)用都可以得到 UIApplication的對象贱纠,這個對象是全局唯一的。
觀察者模式: 當(dāng)一個物體發(fā)生變化時响蕴,會通知所有觀察這個物體的觀察者讓其做出反應(yīng)谆焊。實(shí)現(xiàn)起來無非就是把所有觀察者的對象給這個物體,當(dāng)這個物體的發(fā)生改變浦夷,就會調(diào)用遍歷所有觀察者的對象調(diào)用觀察者的方法從而達(dá)到通知觀察者的目的辖试。
工廠模式
public class Factory{
public static Sample creator(int which){
if (which==1)
return new SampleA();
else if (which==2)
return new SampleB();
}
}
15 淺復(fù)制和深復(fù)制的區(qū)別?
淺層復(fù)制:只復(fù)制指向?qū)ο蟮闹羔槪粡?fù)制引用對象本身军拟。
深層復(fù)制:復(fù)制引用對象本身剃执。
淺復(fù)制好比你和你的影子,你完蛋懈息,你的影子也完蛋
深復(fù)制好比你和你的克隆人肾档,你完蛋,你的克隆人還活著。
- 類別的作用?繼承和類別在實(shí)現(xiàn)中有何區(qū)別?
Category:類別怒见,可以在不獲悉俗慈,不改變原來代碼的情況下往里面添加新的方法,只能添加遣耍,不能刪除修改闺阱,并且如果類別和原來類中的方法產(chǎn)生名稱沖突,則類別將覆蓋原來的方法舵变,因?yàn)轭悇e具有更高的優(yōu)先級酣溃。
Category三個主要作用:
1)將類的實(shí)現(xiàn)分散到多個不同文件夾或者多個不同框架中。
2)創(chuàng)建私有方法的前向引用纪隙。
3)向?qū)ο筇砑臃钦絽f(xié)議赊豌。
集成可以增加,修改或者刪除方法绵咱,并且可以增加屬性碘饼。
- 類別和類擴(kuò)展的區(qū)別。
category和extensions的不同在于 后者可以添加屬性悲伶。另外后者添加的方法是必須要實(shí)現(xiàn)的艾恼。
extensions可以認(rèn)為是一個私有的Category。
- oc中的協(xié)議和java中的接口概念有何不同?
OC的協(xié)議有: “必須實(shí)現(xiàn)(@requied)”和“可選實(shí)現(xiàn)(@optional)”麸锉。
- 什么是KVO和KVC?
KVC: 鍵值編碼钠绍,是一種間接訪問對象的屬性使用字符串來標(biāo)識屬性,而不是通過調(diào)用存取方法淮椰,直接或通過實(shí)例變量來訪問的機(jī)制五慈。
KVO:簡直觀察機(jī)制,提供了觀察某一屬性變化的方法主穗,極大的簡化了代碼泻拦。
- 代理的作用?
代理的目的是改變或傳遞控制鏈。允許一個類在某些特定時刻通知到其他類忽媒,而不需要獲取到那些類的指針争拐。可以減少框架復(fù)雜度晦雨。
另外一點(diǎn)架曹,代理可以理解為java中的回調(diào)監(jiān)聽機(jī)制的一種類似。
- oc中可修改和不可以修改類型闹瞧。
比如NSArray和NSMutableArray绑雄。前者在初始化后的內(nèi)存空間就是固定不可變的,后者可以添加等奥邮,可以動態(tài)申請新的內(nèi)存空間万牺。
- 我們說的oc是動態(tài)運(yùn)行時語言是什么意思?
多態(tài):主要是將數(shù)據(jù)類型的確定由編譯時罗珍,推遲到了運(yùn)行時。
運(yùn)行時機(jī)制是多態(tài)的基礎(chǔ)脚粟。
- 通知和協(xié)議的不同之處?
協(xié)議有控制鏈的關(guān)系覆旱,通知沒有。
- 什么是推送消息?
推送通知更是一種技術(shù)核无。是客戶端獲取資源的一種手段扣唱。
普通情況下,客戶端獲取資源:都是客戶端主動的pull团南。
推送則是服務(wù)器主動push噪沙。
- 關(guān)于多態(tài)性。
多態(tài)已慢,指的是子類指針可以賦值給父類曲聂。
26.關(guān)于單例。
- 說說響應(yīng)鏈佑惠。
事件響應(yīng)鏈。包括點(diǎn)擊事件齐疙,畫面刷新事件等膜楷。在視圖棧內(nèi)從上到下,或者從下到上傳播贞奋《奶可以說點(diǎn)事件的分發(fā),傳遞以及處理轿塔。具體可以去看touch事件特愿。