本文首發(fā)地址:http://www.reibang.com/p/b55513801435
內(nèi)容提要
通過閱讀本篇文章,希望您能了解:如何在 ARC 下孝宗,強制某個變量調(diào)用指定的方法?
前言
首先讓我們先感謝以 Blaine Garst 和 Patrick Beard 為代表的開發(fā)者。他們?yōu)?Objective-C 這門語言添加了眾多特性,而其中最令人喜愛的莫過于 ARC尸红。
相信所有和我一樣經(jīng)歷過手動管理內(nèi)存時代的人,都會對這個特性感到非常的喜愛刹泄。
然而外里,有所得必有所失。本文將會講講 ARC 帶來的一些“麻煩”特石。
一道簡單的面試題
在 MRR 環(huán)境下盅蝗,下面的代碼會?Compile Error / Runtime Crash / NSLog…?
//NSObject+Sun.h
@interface NSObject (Sun)
- (void)shining;
@end
//NSObject+Sun.m
@implementation NSObject (Sun)
- (void)shining
{
NSLog(@"shining");
}
@end
//main.m
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
[NSObject shining];
}
return 0;
}
答案很簡單姆蘸,雖然會產(chǎn)生一個警告?? Class method '+shining' not found (return type defaults to 'id')
墩莫,但是可以正常輸出 shining
。
對此感到困惑的讀者可以查看拙作 http://www.reibang.com/p/e30977484a66
具體到此問題逞敷,可以查看 @halfrost 的文章 神經(jīng)病院Objective-C Runtime住院第二天—消息發(fā)送與轉(zhuǎn)發(fā)
升級版面試題
剛才的代碼在 ARC 環(huán)境下狂秦,也能正常輸出 shining
嗎?
答案是推捐,不會裂问。它會產(chǎn)生一個編譯錯誤??。錯誤的定義如下所示牛柒。
def err_arc_may_not_respond : Error<
"no visible @interface for %0 declares the selector %1">;
解決方案也很簡單堪簿。在 main.m 文件中添加一行代碼即可。
#import "NSObject+Sun.h"
問題分析
為什么在 MRR 下面能夠正常運行的代碼皮壁,卻無法在 ARC 下編譯呢椭更?
實際上,在默認(rèn)情況下蛾魄,在 ARC 下面進行編譯時甜孤,編譯器需要知道該方法是如何聲明的协饲,只有這樣畏腕,編譯器才能自動插入相關(guān)的內(nèi)存管理代碼并進行代碼優(yōu)化缴川。
那么,是否可以強制某個變量執(zhí)行指定的方法呢描馅?答案是:有把夸。
可以通過下面主動聲明的方式,告訴編譯器铭污,請執(zhí)行該方法恋日。
[[NSObject new] performSelector:@selector(shining)];
[NSObject performSelector:@selector(shining)];
下期預(yù)告
相信很多人都沒有看明白,為什么在默認(rèn)情況下嘹狞,編譯器需要知道方法是如何聲明的岂膳?
如果你知道原因,歡迎在下方進行評論磅网。
如果你感到好奇谈截,敬請期待下期。