经过阅读本篇文章,但愿您能了解:如何在 ARC 下,强制某个变量调用指定的方法?面试
首先让咱们先感谢以 Blaine Garst 和 Patrick Beard 为表明的开发者。他们为 Objective-C 这门语言添加了众多特性,而其中最使人喜好的莫过于 ARC。优化
相信全部和我同样经历过手动管理内存时代的人,都会对这个特性感到很是的喜好。code
然而,有所得必有所失。本文将会讲讲 ARC 带来的一些“麻烦”。orm
在 MRR 环境下,下面的代码会?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; }
答案很简单,虽然会产生一个警告⚠️ Class method '+shining' not found (return type defaults to 'id')
,可是能够正常输出 shining
。开发
对此感到困惑的读者能够查看拙做 http://www.jianshu.com/p/e309...get
具体到此问题,能够查看 @halfrost 的文章 神经病院Objective-C Runtime住院次日—消息发送与转发编译器
刚才的代码在 ARC 环境下,也能正常输出 shining
吗?
答案是,不会。它会产生一个编译错误❗️。错误的定义以下所示。内存管理
def err_arc_may_not_respond : Error< "no visible @interface for %0 declares the selector %1">;
解决方案也很简单。在 main.m 文件中添加一行代码便可。io
#import "NSObject+Sun.h"
为何在 MRR 下面可以正常运行的代码,却没法在 ARC 下编译呢?
实际上,在默认状况下,在 ARC 下面进行编译时,编译器须要知道该方法是如何声明的,只有这样,编译器才能自动插入相关的内存管理代码并进行代码优化。
那么,是否能够强制某个变量执行指定的方法呢?答案是:有。
能够经过下面主动声明的方式,告诉编译器,请执行该方法。
[[NSObject new] performSelector:@selector(shining)]; [NSObject performSelector:@selector(shining)];
相信不少人都没有看明白,为何在默认状况下,编译器须要知道方法是如何声明的?
若是你知道缘由,欢迎在下方进行评论。
若是你感到好奇,敬请期待下期。