總結(jié)過些面試題,沒堅持下去债鸡,后來把這些當 checklist江滨,面試的時候?qū)嵲跊]話聊的時候做個提醒,語言厌均、框架唬滑、運行機制性質(zhì)的:
[※]@property中有哪些屬性關鍵字?
[※]weak屬性需要在dealloc中置nil么棺弊?
答:不需要晶密,在 ARC 環(huán)境下,無論是強指針還是弱指針都不需要在 dealloc 中置為 nil 模她,ARC 會自動處理的稻艰。
[※※]@synthesize和@dynamic分別有什么作用?
答:
@property有兩個對應的詞侈净,一個是 @synthesize尊勿,一個是 @dynamic。如果 @synthesize和 @dynamic都沒寫畜侦,那么默認的就是@syntheszie var = _var;
@synthesize 的語義是如果你沒有手動實現(xiàn) setter 方法和 getter 方法元扔,那么編譯器會自動為你加上這兩個方法。
@dynamic 告訴編譯器:屬性的 setter 與 getter 方法由用戶自己實現(xiàn)旋膳,不自動生成澎语。(當然對于 readonly 的屬性只需提供 getter 即可)。假如一個屬性被聲明為 @dynamic var溺忧,然后你沒有提供 @setter方法和 @getter 方法咏连,編譯的時候沒問題,但是當程序運行到 instance.var = someVar鲁森,由于缺 setter 方法會導致程序崩潰祟滴;或者當運行到 someVar = var 時,由于缺 getter 方法同樣會導致崩潰歌溉。編譯時沒問題垄懂,運行時才執(zhí)行相應的方法骑晶,這就是所謂的動態(tài)綁定。
[※※※]ARC下草慧,不顯式指定任何屬性關鍵字時桶蛔,默認的關鍵字都有哪些?
這個問題真是刺中要害漫谷,當我的@property什么都不寫的話仔雷,會怎么樣呢!
@property NSArray *user;
我沒寫這些關鍵詞舔示,效果如下
@property (strong, atomic, readwrite) NSArray *user;
strong 是內(nèi)存的管理方式碟婆,其他的還有weak, copy惕稻, assign(基本類型時候)竖共。
atomic 是線程安全的關鍵詞俺祠,還有nonatomic公给。
readwrite 是讀寫關鍵詞,還有readonly蜘渣。
[※※※]用@property聲明的NSString(或NSArray淌铐,NSDictionary)經(jīng)常使用copy關鍵字,為什么宋梧?如果改用strong關鍵字匣沼,可能造成什么問題?
[※※※]@synthesize合成實例變量的規(guī)則是什么捂龄?假如property名為foo,存在一個名為_foo的實例變量加叁,那么還會自動合成新變量么倦沧?
[※※※※※]在有了自動合成屬性實例變量之后,@synthesize還有哪些使用場景它匕?
[※※]objc中向一個nil對象發(fā)送消息將會發(fā)生什么展融?
不會發(fā)生奔潰
[※※※]objc中向一個對象發(fā)送消息[obj foo]和objc_msgSend()函數(shù)之間有什么關系?
[※※※]什么時候會報unrecognized selector的異常豫柬?
答案
[※※※※]一個objc對象如何進行內(nèi)存布局告希?(考慮有父類的情況)
[※※※※]一個objc對象的isa的指針指向什么?有什么作用烧给?
[※※※※]下面的代碼輸出什么燕偶?
@implementation Son : Father
- (id)init
{
self = [super init];
if (self) {
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
[※※※※]runtime如何通過selector找到對應的IMP地址?(分別考慮類方法和實例方法)
[※※※※]使用runtime Associate方法關聯(lián)的對象础嫡,需要在主對象dealloc的時候釋放么指么?
[※※※※※]objc中的類方法和實例方法有什么本質(zhì)區(qū)別和聯(lián)系酝惧?
[※※※※※]_objc_msgForward函數(shù)是做什么的,直接調(diào)用它將會發(fā)生什么伯诬?
[※※※※※]runtime如何實現(xiàn)weak變量的自動置nil晚唇?
[※※※※※]能否向編譯后得到的類中增加實例變量?能否向運行時創(chuàng)建的類中添加實例變量盗似?為什么哩陕?
[※※※]runloop和線程有什么關系?
[※※※]runloop的mode作用是什么赫舒?
[※※※※]以+ scheduledTimerWithTimeInterval...的方式觸發(fā)的timer悍及,在滑動頁面上的列表時,timer會暫定回調(diào)号阿,為什么并鸵?如何解決?
[※※※※※]猜想runloop內(nèi)部是如何實現(xiàn)的扔涧?
[※]objc使用什么機制管理對象內(nèi)存园担?
[※※※※]ARC通過什么方式幫助開發(fā)者管理內(nèi)存?
[※※※※]不手動指定autoreleasepool的前提下枯夜,一個autorealese對象在什么時刻釋放弯汰?(比如在一個vc的viewDidLoad中創(chuàng)建)
分兩種情況:手動干預釋放時機、系統(tǒng)自動去釋放湖雹。
手動干預釋放時機–指定autoreleasepool 就是所謂的:當前作用域大括號結(jié)束時釋放咏闪。
系統(tǒng)自動去釋放–不手動指定autoreleasepool
Autorelease對象會在當前的 runloop 迭代結(jié)束時釋放。
如果在一個vc的viewDidLoad中創(chuàng)建一個 Autorelease對象摔吏,那么該對象會在 viewDidAppear 方法執(zhí)行前就被銷毀了鸽嫂。
[※※※※]BAD_ACCESS在什么情況下出現(xiàn)?
[※※※※※]蘋果是如何實現(xiàn)autoreleasepool的征讲?
[※※]使用block時什么情況會發(fā)生引用循環(huán)据某,如何解決?
[※※]在block內(nèi)如何修改block外部變量诗箍?
[※※※]使用系統(tǒng)的某些block api(如UIView的block版本寫動畫時)癣籽,是否也考慮引用循環(huán)問題?
[※※]GCD的隊列(dispatch_queue_t)分哪兩種類型滤祖?
[※※※※]如何用GCD同步若干個異步調(diào)用筷狼?(如根據(jù)若干個url異步加載多張圖片,然后在都下載完成后合成一張整圖)
[※※※※]dispatch_barrier_async的作用是什么匠童?
[※※※※※]蘋果為什么要廢棄dispatch_get_current_queue埂材?
[※※※※※]以下代碼運行結(jié)果如何?
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"1");
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
NSLog(@"3");
}
[※※]addObserver:forKeyPath:options:context:各個參數(shù)的作用分別是什么俏让,observer中需要實現(xiàn)哪個方法才能獲得KVO回調(diào)楞遏?
[※※※]如何手動觸發(fā)一個value的KVO
[※※※]若一個類有實例變量NSString *_foo茬暇,調(diào)用setValue:forKey:時,可以以foo還是_foo作為key寡喝?
[※※※※]KVC的keyPath中的集合運算符如何使用糙俗?
[※※※※]KVC和KVO的keyPath一定是屬性么?
[※※※※※]如何關閉默認的KVO的默認實現(xiàn)预鬓,并進入自定義的KVO實現(xiàn)巧骚?
[※※※※※]apple用什么方式實現(xiàn)對一個對象的KVO?
[※※]IBOutlet連出來的視圖屬性為什么可以被設置成weak?
[※※※※※]IB中User Defined Runtime Attributes如何使用格二?
[※※※]如何調(diào)試BAD_ACCESS錯誤
[※※※]lldb(gdb)常用的調(diào)試命令劈彪?