無標題文章

[※]@property中有哪些屬性關鍵字?

有3類。ARC下默認是(atomic, assign, readwrite)。

1.atomic, nonatomic

atomic:原子的。表示該變量為線程安全型,多線程中只能有一個線程能對它進行訪問,但是會影響訪問速度。在非ARC編譯環境下,需要設置訪問鎖來保證對該變量進行正確的get/set。

nonatomic:非原子的。表示該變量為非線程安全型,多個線程可以同時對其進行訪問,訪問速度比較快。但是當兩個不同的線程對其訪問時,容易失控。

2.assign, retain, strong, weak, copy

assign:表示簡單賦值,不更改索引計數。常用于基本數據類型,如NSInteger, CGFloat等。需要注意的是,delegate也是assign類型(原因見http://stackoverflow.com/questions/918698/why-are-objective-c-delegates-usually-given-the-property-assign-instead-of-retai)。

retain:MRC默認值,意思是使用引用計數,每retain一次+1,release一次-1,當引用計數為0時,dealloc被調用,內存被釋放。

strong:ARC默認值。強引用,只要有strong指針,就不會被釋放。

weak:弱引用,如果沒有strong指針了,就會立即被釋放。

copy:用于非共享內存時,每個指針有自己的內存空間,即建立一個相同的的對象。

3.readonly, readwrite

readonly:只有get方法,沒有set方法。

readwrite:有get/set方法。

[※]weak屬性需要在dealloc中置nil么?

不需要。在ARC環境下,系統會自動釋放所有實例變量。但是,當你有一些特殊的非Obj-c對象的實例變量時,你就需要在dealloc中處理他們(如CFRelease)。

詳細見:http://stackoverflow.com/questions/7906804/do-i-set-properties-to-nil-in-dealloc-when-using-arc

延伸:ARC下dealloc過程及.cxx_destruct的探究 http://blog.sunnyxx.com/2014/04/02/objc_dig_arc_dealloc/

[※※]@synthesize和@dynamic分別有什么作用?

synthesize會自動生成setter和getter方法。

dynamic是告訴編譯器setter和getter方法在這個類本身不會實現,而是在其他的地方,比如父類或者會在運行時提供。常用于CoreData。或者想把父類定義的一個property在子類中創建一個outlet時使用。

參考:http://stackoverflow.com/questions/1160498/synthesize-vs-dynamic-what-are-the-differences

[※※※]ARC下,不顯式指定任何屬性關鍵字時,默認的關鍵字都有哪些?

ARC下默認是(atomic, assign, readwrite)。

非ARC下默認是(atomic, retain, readwrite)。

[※※※]用@property聲明的NSString(或NSArray,NSDictionary)經常使用copy關鍵字,為什么?如果改用strong關鍵字,可能造成什么問題?

當某個對象的類有可修改的子類(例如NSString/NSMutableString)時,應該將該屬性的內存管理特性設置為copy。

當使用strong時,這個屬性有可能在你不知情的情況下被更改。

[※※※]@synthesize合成實例變量的規則是什么?假如property名為foo,存在一個名為_foo的實例變量,那么還會自動合成新變量么?

默認的合成規則是這樣:

@synthesize foo = _foo;

不會了。

foo和_foo

[※※※※※]在有了自動合成屬性實例變量之后,@synthesize還有哪些使用場景?

當你想手動自定義setter和getter方法的時候。如readwrite property自定義setter/getter,readonly自定義getter。或者是以下情況:

1.protocol 中定義的屬性(不會自動合成)。

2.重寫父類的屬性時。

3.Category 中聲明的屬性:這種情況,@synthesize 指令不但不能被編譯器自動生成,也不能手動合成屬性。雖然category可以聲明屬性,但不能合成,因為category不能創建類實例變量ivars.為了完整起見,我還是加了這項,因為還是可以通過Objective-C運行時偽造合成屬性

參考:http://stackoverflow.com/questions/19784454/when-should-i-use-synthesize-explicitly

[※※]objc中向一個nil對象發送消息將會發生什么?

什么也不會發生。不會崩潰,也不會接收對應的消息。

[※※※]objc中向一個對象發送消息[obj foo]和objc_msgSend()函數之間有什么關系?

[obj foo];

objc_msgSend(obj, @selector(foo));

這兩個函數是等價的。

[※※※]什么時候會報unrecognized selector的異常?

1.給一個對象發送消息時,先要看這個對象能否接收這個消息。即查看這個類有沒有這個方法,或者有沒有實現這個方法。

2.如果不能接收的話,系統會調用+resolveInstanceMethod這個方法進行動態方法處理。

3.如果resolveMethod返回NO,則會調用forwardingTargetForSelector進行消息轉發。

4.如果我們沒有實現forwardingTargetForSelector,系統就會調用 methodSignatureForSelector和 forwardInvocation。

其中,methodSignatureForSelector用來生成方法簽名,這個簽名就是給 forwardInvocation中的參數 NSInvocation調用的。

而錯誤unrecognized selector sent to instance原因,原來就是因為methodSignatureForSelector這個方法中,由于沒有找到run對應的實現方法,所以返回了一個空的方法簽名,最終導致程序報錯崩潰。

參考:http://www.lxweimin.com/p/1bde36ad9938

[※※※※]一個objc對象如何進行內存布局?(考慮有父類的情況)

1. 類C的類對象(class object)的 super_class都指向了類C父類的類對象(class object), ?NSObject的類對像的 super_class指向0x0

2. 類C的類對象(class object)的 isa指針都指向他的元類對象(metaclass object)

3. 類C的元類對象(metaclass object)的 super_class指針指向父類的元類對象(metaclass object), 例外: NSObject的元類對象(metaclass object)的 super_class指向NSObject的類對象(class object).

4. 類C的元類對象(metaclass object)的 isa指針指都指向 NSObject的元類對象(metaclass object)

參考:http://www.cnblogs.com/csutanyu/archive/2011/12/12/objective-c_memory_layout.html

[※※※※]一個objc對象的isa的指針指向什么?有什么作用?

任何直接或間接繼承了NSObject的類,它的實例對象(instacne objec)中都有一個isa指針,指向它的類對象(class object)。這個類對象(class object)中存儲了關于這個實例對象(instace object)所屬的類的定義的一切:包括變量,方法,遵守的協議等等。

參考:http://www.cnblogs.com/csutanyu/archive/2011/12/12/objective-c_memory_layout.html

[※※※※]下面的代碼輸出什么?

@implementation Son : Father

- (id)init

{

self = [super init];

if (self) {

NSLog(@"%@", NSStringFromClass([self class]));

NSLog(@"%@", NSStringFromClass([super class]));

}

return self;

}

@end

2015-07-25 01:56:12.303 Obj-C Test[8117:1812010] Son

2015-07-25 01:56:12.305 Obj-C Test[8117:1812010] Son

原因: self 和 super 的區別在于,調用的方法,self是從本類里調用,super是從父類里調用。然而接收 class 這個方法的對象都是 Son *son這個對象。但是,Son這個類中沒有實現 class 這個方法,父類Father中里面也沒有實現,Father的父類NSObject中才有實現。所以都是Son。

[※※※※]runtime如何通過selector找到對應的IMP地址?(分別考慮類方法和實例方法)


[※※※※]使用runtime Associate方法關聯的對象,需要在主對象dealloc的時候釋放么?

[※※※※※]objc中的類方法和實例方法有什么本質區別和聯系?

[※※※※※]_objc_msgForward函數是做什么的,直接調用它將會發生什么?

[※※※※※]runtime如何實現weak變量的自動置nil?

[※※※※※]能否向編譯后得到的類中增加實例變量?能否向運行時創建的類中添加實例變量?為什么?

[※※※]runloop和線程有什么關系?

[※※※]runloop的mode作用是什么?

[※※※※]以+ scheduledTimerWithTimeInterval...的方式觸發的timer,在滑動頁面上的列表時,timer會暫定回調,為什么?如何解決?

[※※※※※]猜想runloop內部是如何實現的?

[※]objc使用什么機制管理對象內存?

[※※※※]ARC通過什么方式幫助開發者管理內存?

[※※※※]不手動指定autoreleasepool的前提下,一個autorealese對象在什么時刻釋放?(比如在一個vc的viewDidLoad中創建)

[※※※※]BAD_ACCESS在什么情況下出現?

[※※※※※]蘋果是如何實現autoreleasepool的?

[※※]使用block時什么情況會發生引用循環,如何解決?

[※※]在block內如何修改block外部變量?

[※※※]使用系統的某些block api(如UIView的block版本寫動畫時),是否也考慮引用循環問題?

[※※]GCD的隊列(dispatch_queue_t)分哪兩種類型?

[※※※※]如何用GCD同步若干個異步調用?(如根據若干個url異步加載多張圖片,然后在都下載完成后合成一張整圖)

[※※※※]dispatch_barrier_async的作用是什么?

[※※※※※]蘋果為什么要廢棄dispatch_get_current_queue?

[※※※※※]以下代碼運行結果如何?

1

2

3

4

5

6

7

8

9- (void)viewDidLoad{? ? [superviewDidLoad];NSLog(@"1");dispatch_sync(dispatch_get_main_queue(), ^{NSLog(@"2");? ? });NSLog(@"3");}

[※※]addObserver:forKeyPath:options:context:各個參數的作用分別是什么,observer中需要實現哪個方法才能獲得KVO回調?

[※※※]如何手動觸發一個value的KVO

[※※※]若一個類有實例變量NSString *_foo,調用setValue:forKey:時,可以以foo還是_foo作為key?

[※※※※]KVC的keyPath中的集合運算符如何使用?

[※※※※]KVC和KVO的keyPath一定是屬性么?

[※※※※※]如何關閉默認的KVO的默認實現,并進入自定義的KVO實現?

[※※※※※]apple用什么方式實現對一個對象的KVO?

[※※]IBOutlet連出來的視圖屬性為什么可以被設置成weak?

[※※※※※]IB中User Defined Runtime Attributes如何使用?

[※※※]如何調試BAD_ACCESS錯誤

[※※※]lldb(gdb)常用的調試命令?


參考:

http://linqing-lu.github.io/blog/2015/07/16/ios-mian-shi-ti/

http://www.linuxidc.com/Linux/2014-03/97744.htm

http://blog.csdn.net/dqjyong/article/details/7668601

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,774評論 0 9
  • 【2017年最新】? iOS面試題及答案 設計模式是什么? 你知道哪些設計模式,并簡要敘述? 設計模式是一種編碼經...
    紫色冰雨閱讀 623評論 0 1
  • http://blog.csdn.net/david21984/article/details/57451917 ...
    紫色冰雨閱讀 577評論 0 0
  • 對于Java程序員來說,null是令人頭痛的東西。時常會受到空指針異常(NPE)的騷擾。連Java的發明者都承認這...
    仁昌居士閱讀 224評論 0 0
  • 體驗入:晚上在店宴請客人,餐中服務沒有連接,沒有主動服務,在想為什么服務一直提不上來? 找核心:任何問題的出現都是...
    熊毅濱1349閱讀 211評論 0 0