讲讲你不知道的 ARC (一)
2016-10-08 08:42
204 查看
来源:伯乐在线 - 酷酷的哀殿
内容提要
通过阅读本篇文章,希望您能了解:如何在 ARC 下,强制某个变量调用指定的方法?
前言
首先让我们先感谢以 Blaine Garst 和 Patrick Beard 为代表的开发者。他们为 Objective-C 这门语言添加了众多特性,而其中最令人喜爱的莫过于 ARC。
相信所有和我一样经历过手动管理内存时代的人,都会对这个特性感到非常的喜爱。
然而,有所得必有所失。本文将会讲讲 ARC 带来的一些“麻烦”。
一道简单的面试题
在 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
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/e30977484a66
具体到此问题,可以查看 @halfrost 的文章 神经病院Objective-C Runtime住院第二天—消息发送与转发
升级版面试题
刚才的代码在 ARC 环境下,也能正常输出 shining 吗?
答案是,不会。它会产生一个编译错误❗️。错误的定义如下所示。
def err_arc_may_not_respond : Error;
解决方案也很简单。在 main.m 文件中添加一行代码即可。
#import "NSObject+Sun.h"
问题分析
为什么在 MRR 下面能够正常运行的代码,却无法在 ARC 下编译呢?
实际上,在默认情况下,在 ARC 下面进行编译时,编译器需要知道该方法是如何声明的,只有这样,编译器才能自动插入相关的内存管理代码并进行代码优化。
那么,是否可以强制某个变量执行指定的方法呢?答案是:有。
可以通过下面主动声明的方式,告诉编译器,请执行该方法。
[[NSObject new] performSelector:@selector(shining)];
[NSObject performSelector:@selector(shining)];
下期预告
相信很多人都没有看明白,为什么在默认情况下,编译器需要知道方法是如何声明的?
如果你知道原因,欢迎在下方进行评论。
相关文章推荐
- 不知道做了什么,电脑好卡。。。讲讲Socket,我不太懂,却开始懂得知识
- 在ARC中使用weak报错和文件目录找不到的解决方法
- ARC和MRC混编
- 手把手教你ARC——iOS/Mac开发ARC入门和使用
- 揭秘你不知道的京东管理体系!
- 你不知道的Eclipse用法:插件的安装和卸载
- Android Context完全解析,你所不知道的Context的各种细节
- 你所不知道的五件事情--Java集合框架API(第二部分)
- Android任务和返回栈完全解析,细数那些你所不知道的细节
- 第三方框架和ARC
- ARC
- 你可能不知道的Shell(有趣的知识)
- String类中你不知道的知识
- 你不知道的Eclipse的用法:使用MAT分析Android的内存
- 非ARC模式下内存管理总结
- Android 在不知道ActivityName的情况下启动另一个程序
- 把第三方库MRC换成ARC
- (埋葬那些在网上把简单问题复杂化专业化把垃圾答案胡乱贴的懵懂派)一道月薪3W的java面试题 (小明和小强都是张老师的学生,张老师的生日是某月某日,2人都不知道张老师的生日)
- arc下使用mrc
- 你可能不知道的Visual Studio 2010使用技巧(VS2010的秘密)