Object-c的類可以多重繼承麼?可以實現多個接口麼?Category是什麼?重寫一個類的方式用繼承好還是分類好?為什麼?
答: Object-c的類不可以多重繼承;可以實現多個接口,通過實現多個接口可以完成C++的多重繼承;Category是類別,一般情況用分類好,用Category去重寫類的方法,僅對本Category有效,不會影響到其他類與原有類的關系。
#import 跟#include 又什麼區別,@class呢, #import<> 跟 #import””又什麼區別?
答:#import是Objective-C導入頭文件的關鍵字,#include是C/C++導入頭文件的關鍵字,使用#import頭文件會自動只導入一次,不會重復導入,相當於#include和#pragma once;@class告訴編譯器某個類的聲明,當執行時,才去查看類的實現文件,可以解決頭文件的相互包含;#import<>用來包含系統的頭文件,#import””用來包含用戶頭文件。
屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什麼作用,在那種情況下用?
1. readwrite 是可讀可寫特性;需要生成getter方法和setter方法時 2. readonly 是只讀特性 只會生成getter方法 不會生成setter方法 ;不希望屬性在類外改變 3. assign 是賦值特性,setter方法將傳入參數賦值給實例變量;僅設置變量時; 4. retain 表示持有特性,setter方法將傳入參數先保留,再賦值,傳入參數的retaincount會+1; 5. copy 表示賦值特性,setter方法將傳入對象復制一份;需要完全一份新的變量時。 6. nonatomic 非原子操作,決定編譯器生成的setter getter是否是原子操作,atomic表示多線程安全,一般使用nonatomic
寫一個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; }
對於語句NSString*obj = [[NSData alloc] init]; obj在編譯時和運行時分別時什麼類型的對象?
編譯時是NSString的類型;運行時是NSData類型的對象
常見的object-c的數據類型有那些, 和C的基本數據類型有什麼區別?如:NSInteger和int
object-c的數據類型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,這些都是class,創建後便是對象,而C語言的基本數據類型int,只是一定字節的內存空間,用於存放數值;NSInteger是基本數據類型,並不是NSNumber的子類,當然也不是NSObject的子類。NSInteger是基本數據類型Int或者Long的別名(NSInteger的定義typedef long NSInteger),它的區別在於,NSInteger會根據系統是32位還是64位來決定是本身是int還是Long。
id 聲明的對象有什麼特性?
id 聲明的對象具有運行時的特性,即可以指向任意類型的objcetive-c的對象;
Object C中創建線程的方法是什麼?如果在主線程中執行代碼,方法是什麼?如果想延時執行代碼、方法又是什麼?
線程創建有三種方法:使用NSThread創建、使用GCD的dispatch、使用子類化的NSOperation,然後將其加入NSOperationQueue;在主線程執行代碼,方法是performSelectorOnMainThread,如果想延時執行代碼可以用performSelector:onThread:withObject:waitUntilDone:
淺復制和深復制的區別?
答案:淺層復制:只復制指向對象的指針,而不復制引用對象本身。深層復制:復制引用對象本身。意思就是說我有個A對象,復制一份後得到A_copy對象後,對於淺復制來說,A和A_copy指向的是同一個內存資源,復制的只不過是是一個指針,對象本身資源還是只有一份,那如果我們對A_copy執行了修改操作,那麼發現A引用的對象同樣被修改,這其實違背了我們復制拷貝的一個思想。深復制就好理解了,內存中存在了兩份獨立對象本身。用網上一哥們通俗的話將就是:淺復制好比你和你的影子,你完蛋,你的影子也完蛋深復制好比你和你的克隆人,你完蛋,你的克隆人還活著。
我們說的oc是動態運行時語言是什麼意思?
答案:多態。 主要是將數據類型的確定由編譯時,推遲到了運行時。這個問題其實淺涉及到兩個概念,運行時和多態。簡單來說,運行時機制使我們直到運行時才去決定一個對象的類別,以及調用該類別對象指定方法。多態:不同對象以自己的方式響應相同的消息的能力叫做多態。意思就是假設生物類(life)都用有一個相同的方法-eat;那人類屬於生物,豬也屬於生物,都繼承了life後,實現各自的eat,但是調用是我們只需調用各自的eat方法。也就是不同的對象以自己的方式響應了相同的消息(響應了eat這個選擇器)。因此也可以說,運行時機制是多態的基礎?~~~
通知和協議的不同之處?
答案:協議有控制鏈(has-a)的關系,通知沒有。首先我一開始也不太明白,什麼叫控制鏈(專業術語了~)。但是簡單分析下通知和代理的行為模式,我們大致可以有自己的理解簡單來說,通知的話,它可以一對多,一條消息可以發送給多個消息接受者。代理按我們的理解,到不是直接說不能一對多,比如我們知道的明星經濟代理人,很多時候一個經濟人負責好幾個明星的事務。只是對於不同明星間,代理的事物對象都是不一樣的,一一對應,不可能說明天要處理A明星要一個發布會,代理人發出處理發布會的消息後,別稱B的發布會了。但是通知就不一樣,他只關心發出通知,而不關心多少接收到感興趣要處理。因此控制鏈(has-a從英語單詞大致可以看出,單一擁有和可控制的對應關系。
frame和bounds有什麼不同?
答案:frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統) bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)
NSOperation queue?
答案:存放NSOperation的集合類。操作和操作隊列,基本可以看成java中的線程和線程池的概念。用於處理ios多線程開發的問題。網上部分資料提到一點是,雖然是queue,但是卻並不是帶有隊列的概念,放入的操作並非是按照嚴格的先進現出。這邊又有個疑點是,對於隊列來說,先進先出的概念是Afunc添加進隊列,Bfunc緊跟著也進入隊列,Afunc先執行這個是必然的,但是Bfunc是等Afunc完全操作完以後,B才開始啟動並且執行,因此隊列的概念離亂上有點違背了多線程處理這個概念。但是轉念一想其實可以參考銀行的取票和叫號系統。因此對於A比B先排隊取票但是B率先執行完操作,我們亦然可以感性認為這還是一個隊列。但是後來看到一票關於這操作隊列話題的文章,其中有一句提到“因為兩個操作提交的時間間隔很近,線程池中的線程,誰先啟動是不定的。”瞬間覺得這個queue名字有點忽悠人了,還不如pool~綜合一點,我們知道他可以比較大的用處在於可以幫組多線程編程就好了。
什麼是延遲加載?
答案:懶漢模式,只在用到的時候才去初始化。也可以理解成延時加載。我覺得最好也最簡單的一個列子就是tableView中圖片的加載顯示了。一個延時載,避免內存過高,一個異步加載,避免線程堵塞。