昨天去了網易參加了次iOS面試,參觀了下網易的辦公環境,也認識到了一些不足。分享下部分問到的問題。(有問題歡迎評論)
weak 和 assign 的區別?
assign 可以用作對象和基本數據類型,使用之后如果沒有置為nil,可能就會產生野指針。
weak 只可以用于對象, 一旦不進行使用后,默認會被置為nil,就不會產生野指針。
weak是如何將不用的指針置為nil?
runtime 對注冊的類, 會進行布局,對于 weak 對象會放入一個 hash 表中。 用 weak 指向的對象內存地址作為 key,當此對象的引用計數為0的時候會 dealloc,假如 weak 指向的對象內存地址是a,那么就會以a為鍵, 在這個 weak 表中搜索,找到所有以a為鍵的 weak 對象,從而設置為 nil。
Post 和 Put 請求區別?
POST
用于提交請求,可以更新或者創建資源,是非冪等的。如果次發出同樣的POST請求后,其結果是創建出了若干的資源。
PUT
用于向指定的URI傳送更新資源,是冪等的。比如用PUT修改一篇文章,然后在做同樣的操作,每次操作后的結果并沒有不同。
創建操作可以使用POST,也可以使用PUT,區別在于POST 是作用在一個集合資源之上的(/uri),而PUT操作是作用在一個具體資源之上的(/uri/xxx),再通俗點說,如果URL可以在客戶端確定,那么就使用PUT,如果是在服務端確定,那么就使用POST,比如說很多資源使用數據庫自增主鍵作為標識信息,而創建的資源的標識信息到底是什么只能由服務端提供,這個時候就必須使用POST。
CoreData 是否線程安全?
“In Core Data, the managed object context can be used with two concurrency patterns, defined by NSMainQueueConcurrencyType and NSPrivateQueueConcurrencyType.”
(Developer Library Core Data)
關于其他類的線程安全可參考 :
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html
Swift中map和flatmap區別?
flatMap很像map函數,但是它摒棄了那些值為nil的元素。而且flapMap函數能夠將可選類型(optional)轉換為非可選類型(non-optionals),且對多維數組使用會降維。
編譯后可不可以為類增加屬性?
可以,甚至可以給在分類中(category)添加
static char *propertyCharkey = "propertyKey";
- (void)setPropertyWithName:(NSString *)name{
objc_setAssociatedObject(self, &propertyCharkey, name, OBJC_ASSOCIATION_COPY);
}
- (NSString *)getProperty{
return objc_getAssociatedObject(self, &propertyCharkey);
}
方法調用原理?
在Objective-C中,消息直到運行時才綁定到方法實現上。編譯器會將消息表達式[receiver message]轉化為一個消息函數的調用,即objc_msgSend。這個函數將消息接收者和方法名作為其基礎參數,如以下所示:
objc_msgSend(receiver, selector)
如果消息中還有其它參數,則該方法的形式如下所示:
objc_msgSend(receiver, selector, arg1, arg2, …)
這個函數完成了動態綁定的所有事情:
- 首先它找到selector對應的方法實現。因為同一個方法可能在不同的類中有不同的實現,所以我們需要依賴于接收者的類來找到的確切的實現。
- 它調用方法實現,并將接收者對象及方法的所有參數傳給它。
- 最后,它將實現返回的值作為它自己的返回值。
block部分
何時需要使用weakSelf?
weakSelf通常為了消除循環引用,如果block沒有直接或者間接被self存儲,就不會產生循環引用, 這時使用self是沒問題的。
比如常見的動畫,雖然block retain了self,但self并沒有retain block
[UIView animateWithDuration:0.5 animations:^{
self.view.backgroundColor = [UIColor grayColor];
}];
下面這樣會造成循環引用,需要使用weak self
@property (nonatomic, strong) void (^testBlock)();
self.testBlock = ^(){
self.view.backgroundColor = [UIColor blackColor];
};
下面這種情況也是很常見的:
@property (nonatomic, strong) Object *object;
self.object = [[Object alloc]init];
[self.object blockFunction:^{
self.view.backgroundColor = [UIColor blueColor];
}];
但是光看這些是不能決定是否使用weak self的,因為根本不知道object這個實例是否在方法blockFunction內存儲了block并間接引用了self
這里就需要使用weak self來打破self-self.object-block這個引用環
- (void)blockFunction:(ObjectBlock)block{
self.testBlock = block;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
block();
});
}
下面倆個問題了解比較少,得清楚block實現原理,抽空好好研究下
__block 是如何實現的?
http://blog.csdn.net/abc649395594/article/details/47086751