在 Objective-C 中向 nil 發(fā)送消息是完全有效的——只是在運行時不會有任何作用:
1. 如果一個方法返回值是一個對象坞淮,那么發(fā)送給nil的消息將返回0(nil)
2. 如果方法返回值為指針類型残炮,其指針大小為小于或者等于sizeof(void*),float揍愁,double,long double 或者 long long 的整型標量杀饵,發(fā)送給 nil 的消息將返回0莽囤。
3. 如果方法返回值為結構體,發(fā)送給 nil 的消息將返回0。結構體中各個字段的值將都是0凹髓。
4. 如果方法的返回值不是上述提到的幾種情況烁登,那么發(fā)送給 nil 的消息的返回值將是未定義的。
具體原因如下:
objc是動態(tài)語言蔚舀,每個方法在運行時會被動態(tài)轉為消息發(fā)送饵沧,即:
objc_msgSend(receiver, selector)。
那么赌躺,為了方便理解這個內容狼牺,還是貼一個objc的源代碼:
objc在向一個對象發(fā)送消息時,runtime庫會根據對象的isa指針找到該對象實際所屬的類礼患,然后在該類中的方法列表以及其父類方法列表中尋找方法運行是钥,然后在發(fā)送消息的時候掠归,objc_msgSend方法不會返回值,所謂的返回內容都是具體調用時執(zhí)行的悄泥。那么虏冻,回到本題,如果向一個nil對象發(fā)送消息弹囚,首先在尋找對象的isa指針時就是0地址返回了厨相,所以不會出現任何錯誤