来源:伯乐在线 - 酷酷的哀殿

链接:http://ios.jobbole.com/89420/

点击 → 申请加入伯乐在线专栏作者

内容提要

通过阅读本篇文章,希望您能了解:如何在 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)];

下期预告

相信很多人都没有看明白,为什么在默认情况下,编译器需要知道方法是如何声明的?

如果你知道原因,欢迎在下方进行评论。

最新文章

  1. [收集]MVC3 HTML辅助方法集录
  2. 理解HTML语义化
  3. overflow:hidden清除浮动原理
  4. DevExtreme官方视频教程分享
  5. [AJAX系列]$.get(url,[data],[fn],[type])
  6. 移植linux-2.6.32.2到qq2440
  7. dwz简单配置与操作
  8. UVaLive 7500 Boxes and Balls (数学)
  9. 开源免费的C/C++网络库(c/c++ sockets library)
  10. C# WebService的简单和复杂参数类型和结果的JSON格式
  11. 九度OJ 1434 今年暑假不AC
  12. 消息机制 - Windows程序设计(SDK)004
  13. CodeSmith使用总结--调用自定义方法
  14. hdu5086——Revenge of Segment Tree
  15. 【转】Jython简单入门
  16. [Node.js]REPL(交互式解释器)
  17. Electron 打包Mac安装包代码签名问题解决方案Could not get code signature for running application
  18. return *this 与return this的区别
  19. .NET Framework 平台构造基础
  20. win2012R2安装net4.6.2失败提示“更新2919355包问题,或者win8.1、win10”的错误

热门文章

  1. 【转】SQL常用的语句和函数
  2. Struts – Multiple configuration files example
  3. Wisdombud.CommonTool及其应用
  4. 子iframe刷新父ifrmae的方法
  5. windows 下使用免安裝版MySql5.5
  6. 使用spring.net 1.3.2框架部署在虚拟目录上发生错误
  7. springmvc中forward和redirect
  8. JS瀑布流布局模式(2)
  9. GridView实现多表头合并[转]
  10. 从零开始学android开发-adt-bundle-eclipse下的修改android app名称