關于- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInt...

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay是NSObject分類中的方法:

// 位于NSRunLoop.h頭文件中
@interface NSObject (NSDelayedPerforming)  

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

@end

某次用類如ViewController直接調用- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay方法,運行成功:

[ViewController performSelector:@selector(test:) withObject:@"abc" afterDelay:0.5];

運行成功原因:NSObject的方法都可以使用類方法直接調用

OC對象模型

我們先看下面代碼漫贞,首先實現(xiàn)NSObject和NSString的兩個分類:

#import <Foundation/Foundation.h>
@interface NSObject (myTest)
- (void)testFunc;
@end

@interface NSString (myTest)
- (void)testFunc;
- (void)testString;
@end

@implementation NSObject (myTest)
-(void) testFunc
{
    NSLog(@"NSObject testFunc: 執(zhí)行");
}
@end

@implementation NSString (myTest)
- (void)testFunc
{
    NSLog(@"NSString testFunc: 執(zhí)行");
}

- (void)testString {
    NSLog(@"NSString testString: 執(zhí)行");
}
@end

在ViewController中分別使用類調用分類中的方法:

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [NSObject testFunc];
    [NSString testFunc];
    [NSString testString];
}
@end

問題:
1.首先是否能成功編譯
2.如果能成功編譯執(zhí)行結果是什么九杂,為什么會出現(xiàn)這個結果呢

回答:
1.不能成功編譯, [NSString testString]會報如下錯誤

No known class method for selector 'testString'

從錯誤原因可以明顯看到 NSString沒有testString類方法口叙。

對編譯不成功的代碼刪除后如下重新編譯,成功運行

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [NSObject testFunc];
    [NSString testFunc];
}
@end

2.運行結果:

2018-05-03 15:58:22.668416+0800 test--OC-ObjectModel[12480:498039] NSObject testFunc: 執(zhí)行
2018-05-03 15:58:22.668791+0800 test--OC-ObjectModel[12480:498039] NSObject testFunc: 執(zhí)行

NSString和NSObject調用testFunc方法執(zhí)行結果一樣,最后都是執(zhí)行NSObject分類的testFunc方法攘蔽。

3.分析原因:
NSObject實例方法是特殊的,可以使用類來調用政模,這個特殊性也是由于OC對象模型決定的岗宣,類對象模型里主要包括實例對象-》類對象-》類元對象, 1)實例方法調用會從類對象開始搜索方法淋样,如果在類對象里沒有搜索到方法耗式,則沿父類對象網(wǎng)上搜索,直到NSObject這個類對象為止趁猴, 2)類方法調用會從元類對象開始搜索方法刊咳,如果在元類對象里沒有搜索到方法,則沿父元類對象網(wǎng)上搜索儡司,到NSObject這個元類對象還是沒有搜索到娱挨,則會搜索NSObject這個元類對象的父對象NSObject類對象。
所以捕犬,上面兩個類方法調用都沿著元類對象一直找到的NSObject這個類對象跷坝。

嘗試:依據(jù)方法搜索原理,如果使用實例調用類方法會報錯的碉碉,大伙可以自己試驗下柴钻。

參考文章:iOS 方法調用的過程

performSelector的原理以及用法

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市垢粮,隨后出現(xiàn)的幾起案子贴届,更是在濱河造成了極大的恐慌,老刑警劉巖蜡吧,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粱腻,死亡現(xiàn)場離奇詭異,居然都是意外死亡斩跌,警方通過查閱死者的電腦和手機绍些,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耀鸦,“玉大人柬批,你說我怎么就攤上這事⌒涠” “怎么了氮帐?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洛姑。 經(jīng)常有香客問我上沐,道長,這世上最難降的妖魔是什么楞艾? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任参咙,我火速辦了婚禮龄广,結果婚禮上,老公的妹妹穿的比我還像新娘蕴侧。我一直安慰自己择同,他們只是感情好,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布净宵。 她就那樣靜靜地躺著敲才,像睡著了一般。 火紅的嫁衣襯著肌膚如雪择葡。 梳的紋絲不亂的頭發(fā)上紧武,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天,我揣著相機與錄音敏储,去河邊找鬼脏里。 笑死,一個胖子當著我的面吹牛虹曙,可吹牛的內容都是我干的。 我是一名探鬼主播番舆,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼酝碳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恨狈?” 一聲冷哼從身側響起疏哗,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎禾怠,沒想到半個月后返奉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡吗氏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年芽偏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弦讽。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡污尉,死狀恐怖,靈堂內的尸體忽然破棺而出往产,到底是詐尸還是另有隱情被碗,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布仿村,位于F島的核電站锐朴,受9級特大地震影響,放射性物質發(fā)生泄漏蔼囊。R本人自食惡果不足惜焚志,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一衣迷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧娩嚼,春花似錦蘑险、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贵少,卻和暖如春呵俏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滔灶。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工普碎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人录平。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓麻车,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斗这。 傳聞我的和親對象是個殘疾皇子动猬,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內容