[※]@property中有哪些屬性關(guān)鍵字?
有3類。ARC下默認(rèn)是(atomic, assign, readwrite)。
1.atomic, nonatomic
atomic:原子的。表示該變量為線程安全型,多線程中只能有一個(gè)線程能對(duì)它進(jìn)行訪問(wèn),但是會(huì)影響訪問(wèn)速度。在非ARC編譯環(huán)境下,需要設(shè)置訪問(wèn)鎖來(lái)保證對(duì)該變量進(jìn)行正確的get/set。
nonatomic:非原子的。表示該變量為非線程安全型,多個(gè)線程可以同時(shí)對(duì)其進(jìn)行訪問(wèn),訪問(wèn)速度比較快。但是當(dāng)兩個(gè)不同的線程對(duì)其訪問(wèn)時(shí),容易失控。
2.assign, retain, strong, weak, copy
assign:表示簡(jiǎn)單賦值,不更改索引計(jì)數(shù)。常用于基本數(shù)據(jù)類型,如NSInteger, CGFloat等。需要注意的是,delegate也是assign類型(原因見(jiàn)http://stackoverflow.com/questions/918698/why-are-objective-c-delegates-usually-given-the-property-assign-instead-of-retai)。
retain:MRC默認(rèn)值,意思是使用引用計(jì)數(shù),每retain一次+1,release一次-1,當(dāng)引用計(jì)數(shù)為0時(shí),dealloc被調(diào)用,內(nèi)存被釋放。
strong:ARC默認(rèn)值。強(qiáng)引用,只要有strong指針,就不會(huì)被釋放。
weak:弱引用,如果沒(méi)有strong指針了,就會(huì)立即被釋放。
copy:用于非共享內(nèi)存時(shí),每個(gè)指針有自己的內(nèi)存空間,即建立一個(gè)相同的的對(duì)象。
3.readonly, readwrite
readonly:只有g(shù)et方法,沒(méi)有set方法。
readwrite:有g(shù)et/set方法。
[※]weak屬性需要在dealloc中置nil么?
不需要。在ARC環(huán)境下,系統(tǒng)會(huì)自動(dòng)釋放所有實(shí)例變量。但是,當(dāng)你有一些特殊的非Obj-c對(duì)象的實(shí)例變量時(shí),你就需要在dealloc中處理他們(如CFRelease)。
詳細(xì)見(jiàn):http://stackoverflow.com/questions/7906804/do-i-set-properties-to-nil-in-dealloc-when-using-arc
延伸:ARC下dealloc過(guò)程及.cxx_destruct的探究 http://blog.sunnyxx.com/2014/04/02/objc_dig_arc_dealloc/
[※※]@synthesize和@dynamic分別有什么作用?
synthesize會(huì)自動(dòng)生成setter和getter方法。
dynamic是告訴編譯器setter和getter方法在這個(gè)類本身不會(huì)實(shí)現(xiàn),而是在其他的地方,比如父類或者會(huì)在運(yùn)行時(shí)提供。常用于CoreData。或者想把父類定義的一個(gè)property在子類中創(chuàng)建一個(gè)outlet時(shí)使用。
參考:http://stackoverflow.com/questions/1160498/synthesize-vs-dynamic-what-are-the-differences
[※※※]ARC下,不顯式指定任何屬性關(guān)鍵字時(shí),默認(rèn)的關(guān)鍵字都有哪些?
ARC下默認(rèn)是(atomic, assign, readwrite)。
非ARC下默認(rèn)是(atomic, retain, readwrite)。
[※※※]用@property聲明的NSString(或NSArray,NSDictionary)經(jīng)常使用copy關(guān)鍵字,為什么?如果改用strong關(guān)鍵字,可能造成什么問(wèn)題?
當(dāng)某個(gè)對(duì)象的類有可修改的子類(例如NSString/NSMutableString)時(shí),應(yīng)該將該屬性的內(nèi)存管理特性設(shè)置為copy。
當(dāng)使用strong時(shí),這個(gè)屬性有可能在你不知情的情況下被更改。
[※※※]@synthesize合成實(shí)例變量的規(guī)則是什么?假如property名為foo,存在一個(gè)名為_(kāi)foo的實(shí)例變量,那么還會(huì)自動(dòng)合成新變量么?
默認(rèn)的合成規(guī)則是這樣:
@synthesize foo = _foo;
不會(huì)了。

[※※※※※]在有了自動(dòng)合成屬性實(shí)例變量之后,@synthesize還有哪些使用場(chǎng)景?
當(dāng)你想手動(dòng)自定義setter和getter方法的時(shí)候。如readwrite property自定義setter/getter,readonly自定義getter。或者是以下情況:
1.protocol 中定義的屬性(不會(huì)自動(dòng)合成)。
2.重寫(xiě)父類的屬性時(shí)。
3.Category 中聲明的屬性:這種情況,@synthesize 指令不但不能被編譯器自動(dòng)生成,也不能手動(dòng)合成屬性。雖然category可以聲明屬性,但不能合成,因?yàn)閏ategory不能創(chuàng)建類實(shí)例變量ivars.為了完整起見(jiàn),我還是加了這項(xiàng),因?yàn)檫€是可以通過(guò)Objective-C運(yùn)行時(shí)偽造合成屬性
參考:http://stackoverflow.com/questions/19784454/when-should-i-use-synthesize-explicitly
[※※]objc中向一個(gè)nil對(duì)象發(fā)送消息將會(huì)發(fā)生什么?
什么也不會(huì)發(fā)生。不會(huì)崩潰,也不會(huì)接收對(duì)應(yīng)的消息。
[※※※]objc中向一個(gè)對(duì)象發(fā)送消息[obj foo]和objc_msgSend()函數(shù)之間有什么關(guān)系?
[obj foo];
objc_msgSend(obj, @selector(foo));
這兩個(gè)函數(shù)是等價(jià)的。
[※※※]什么時(shí)候會(huì)報(bào)unrecognized selector的異常?
1.給一個(gè)對(duì)象發(fā)送消息時(shí),先要看這個(gè)對(duì)象能否接收這個(gè)消息。即查看這個(gè)類有沒(méi)有這個(gè)方法,或者有沒(méi)有實(shí)現(xiàn)這個(gè)方法。
2.如果不能接收的話,系統(tǒng)會(huì)調(diào)用+resolveInstanceMethod這個(gè)方法進(jìn)行動(dòng)態(tài)方法處理。
3.如果resolveMethod返回NO,則會(huì)調(diào)用forwardingTargetForSelector進(jìn)行消息轉(zhuǎn)發(fā)。
4.如果我們沒(méi)有實(shí)現(xiàn)forwardingTargetForSelector,系統(tǒng)就會(huì)調(diào)用 methodSignatureForSelector和 forwardInvocation。
其中,methodSignatureForSelector用來(lái)生成方法簽名,這個(gè)簽名就是給 forwardInvocation中的參數(shù) NSInvocation調(diào)用的。
而錯(cuò)誤unrecognized selector sent to instance原因,原來(lái)就是因?yàn)閙ethodSignatureForSelector這個(gè)方法中,由于沒(méi)有找到run對(duì)應(yīng)的實(shí)現(xiàn)方法,所以返回了一個(gè)空的方法簽名,最終導(dǎo)致程序報(bào)錯(cuò)崩潰。
參考:http://www.itdecent.cn/p/1bde36ad9938
[※※※※]一個(gè)objc對(duì)象如何進(jìn)行內(nèi)存布局?(考慮有父類的情況)
1. 類C的類對(duì)象(class object)的 super_class都指向了類C父類的類對(duì)象(class object), ?NSObject的類對(duì)像的 super_class指向0x0
2. 類C的類對(duì)象(class object)的 isa指針都指向他的元類對(duì)象(metaclass object)
3. 類C的元類對(duì)象(metaclass object)的 super_class指針指向父類的元類對(duì)象(metaclass object), 例外: NSObject的元類對(duì)象(metaclass object)的 super_class指向NSObject的類對(duì)象(class object).
4. 類C的元類對(duì)象(metaclass object)的 isa指針指都指向 NSObject的元類對(duì)象(metaclass object)
參考:http://www.cnblogs.com/csutanyu/archive/2011/12/12/objective-c_memory_layout.html
[※※※※]一個(gè)objc對(duì)象的isa的指針指向什么?有什么作用?
任何直接或間接繼承了NSObject的類,它的實(shí)例對(duì)象(instacne objec)中都有一個(gè)isa指針,指向它的類對(duì)象(class object)。這個(gè)類對(duì)象(class object)中存儲(chǔ)了關(guān)于這個(gè)實(shí)例對(duì)象(instace object)所屬的類的定義的一切:包括變量,方法,遵守的協(xié)議等等。
參考: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 的區(qū)別在于,調(diào)用的方法,self是從本類里調(diào)用,super是從父類里調(diào)用。然而接收 class 這個(gè)方法的對(duì)象都是 Son *son這個(gè)對(duì)象。但是,Son這個(gè)類中沒(méi)有實(shí)現(xiàn) class 這個(gè)方法,父類Father中里面也沒(méi)有實(shí)現(xiàn),F(xiàn)ather的父類NSObject中才有實(shí)現(xiàn)。所以都是Son。
[※※※※]runtime如何通過(guò)selector找到對(duì)應(yīng)的IMP地址?(分別考慮類方法和實(shí)例方法)
[※※※※]使用runtime Associate方法關(guān)聯(lián)的對(duì)象,需要在主對(duì)象dealloc的時(shí)候釋放么?
[※※※※※]objc中的類方法和實(shí)例方法有什么本質(zhì)區(qū)別和聯(lián)系?
[※※※※※]_objc_msgForward函數(shù)是做什么的,直接調(diào)用它將會(huì)發(fā)生什么?
[※※※※※]runtime如何實(shí)現(xiàn)weak變量的自動(dòng)置nil?
[※※※※※]能否向編譯后得到的類中增加實(shí)例變量?能否向運(yùn)行時(shí)創(chuàng)建的類中添加實(shí)例變量?為什么?
[※※※]runloop和線程有什么關(guān)系?
[※※※]runloop的mode作用是什么?
[※※※※]以+ scheduledTimerWithTimeInterval...的方式觸發(fā)的timer,在滑動(dòng)頁(yè)面上的列表時(shí),timer會(huì)暫定回調(diào),為什么?如何解決?
[※※※※※]猜想runloop內(nèi)部是如何實(shí)現(xiàn)的?
[※]objc使用什么機(jī)制管理對(duì)象內(nèi)存?
[※※※※]ARC通過(guò)什么方式幫助開(kāi)發(fā)者管理內(nèi)存?
[※※※※]不手動(dòng)指定autoreleasepool的前提下,一個(gè)autorealese對(duì)象在什么時(shí)刻釋放?(比如在一個(gè)vc的viewDidLoad中創(chuàng)建)
[※※※※]BAD_ACCESS在什么情況下出現(xiàn)?
[※※※※※]蘋(píng)果是如何實(shí)現(xiàn)autoreleasepool的?
[※※]使用block時(shí)什么情況會(huì)發(fā)生引用循環(huán),如何解決?
[※※]在block內(nèi)如何修改block外部變量?
[※※※]使用系統(tǒng)的某些block api(如UIView的block版本寫(xiě)動(dòng)畫(huà)時(shí)),是否也考慮引用循環(huán)問(wèn)題?
[※※]GCD的隊(duì)列(dispatch_queue_t)分哪兩種類型?
[※※※※]如何用GCD同步若干個(gè)異步調(diào)用?(如根據(jù)若干個(gè)url異步加載多張圖片,然后在都下載完成后合成一張整圖)
[※※※※]dispatch_barrier_async的作用是什么?
[※※※※※]蘋(píng)果為什么要廢棄dispatch_get_current_queue?
[※※※※※]以下代碼運(yùn)行結(jié)果如何?
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:各個(gè)參數(shù)的作用分別是什么,observer中需要實(shí)現(xiàn)哪個(gè)方法才能獲得KVO回調(diào)?
[※※※]如何手動(dòng)觸發(fā)一個(gè)value的KVO
[※※※]若一個(gè)類有實(shí)例變量NSString *_foo,調(diào)用setValue:forKey:時(shí),可以以foo還是_foo作為key?
[※※※※]KVC的keyPath中的集合運(yùn)算符如何使用?
[※※※※]KVC和KVO的keyPath一定是屬性么?
[※※※※※]如何關(guān)閉默認(rèn)的KVO的默認(rèn)實(shí)現(xiàn),并進(jìn)入自定義的KVO實(shí)現(xiàn)?
[※※※※※]apple用什么方式實(shí)現(xiàn)對(duì)一個(gè)對(duì)象的KVO?
[※※]IBOutlet連出來(lái)的視圖屬性為什么可以被設(shè)置成weak?
[※※※※※]IB中User Defined Runtime Attributes如何使用?
[※※※]如何調(diào)試BAD_ACCESS錯(cuò)誤
[※※※]lldb(gdb)常用的調(diào)試命令?
參考:
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