[※]@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;
不會了。
[※※※※※]在有了自動合成屬性實例變量之后,@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