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

链接: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)];

下期预告

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

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

讲讲你不知道的 ARC (一)的更多相关文章

  1. LEO原创-FMX之你不知道的ARC

    LEO原创13498714 FMX加入了ARC技术,对象创建后不用释放,FMX会帮你释放,是不是这样就不用关心对象的释放了呢,非也! 写简单的代码,这个功能也许很好用,但如果你写的是一个项目,那隐藏的 ...

  2. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  3. arc下内存泄漏的解决小技巧

    一定要注意,我们运行app时,一定要关心内存的使用,尽量不要超过20M,即使有很多图片要显示也绝对不能超过30M.所以运行自己开发的app时多关心内存的使用是个很好的习惯. 对于性能,内存的优化,这个 ...

  4. iOS之内存管理(ARC)

    iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方 ...

  5. 说说循环与闭包——《你不知道的JS》读书笔记(一)

    什么是闭包 <你不知道的JS>里有对闭包的定义:"当函数可以记住并访问所在的词法作用域,即使函数是在当前作用域之外执行,这就产生了闭包." 讲闭包是啥的太多了...就一 ...

  6. 你不知道的Canvas(二)

    你不知道的Canvas(二) 一.色彩Colors 到目前为止,我们只看到过绘制内容的方法.如果我们想要给图形上色,有两个重要的属性可以做到:fillStyle 和 strokeStyle. fill ...

  7. 通俗易懂的来讲讲DOM

    DOM是所有前端开发每天打交道的东西,但是随着jQuery等库的出现,大大简化了DOM操作,导致大家慢慢的“遗忘”了它的本来面貌.不过,要想深入学习前端知识,对DOM的了解是不可或缺的,所以本文力图系 ...

  8. Convert BSpline Curve to Arc Spline in OpenCASCADE

    Convert BSpline Curve to Arc Spline in OpenCASCADE eryar@163.com Abstract. The paper based on OpenCA ...

  9. MySQL 系列(二) 你不知道的数据库操作

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 本章内容: 查看\创建\使用\删除 数据库 用户管理及授权实战 局域网 ...

随机推荐

  1. SQL 脚本

    1.USE语句 USE语句用于设置当前数据库,如果没有USE语句,那么就由执行脚本的任何用户来确定执行脚本时当前数据库是正确的.如果只是一个通用脚本,那么省去USE语句实际上可能更有益.通常,如果在脚 ...

  2. 纯JS Web在线可拖拽的流程设计器

    F2工作流引擎之-纯JS Web在线可拖拽的流程设计器 Web纯JS流程设计器无需编程,完全是通过鼠标拖.拉.拽的方式来完成,支持串行.并行.分支.异或分支.M取N路分支.会签.聚合.多重聚合.退回. ...

  3. Speex for Android

    http://blog.csdn.net/chenfeng0104/article/details/7088138在Android开发中,需要录音并发送到对方设备上.这时问题来了,手机常会是GPRS. ...

  4. codeforces 601A The Two Routes(最短路 flody)

    A. The Two Routes time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  5. Python基础 条件、循环

    1.条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. if if语句执行有个特点,它是从上往下判断,如果在某个判断上是True,把该判断对应的 ...

  6. iOS 8自动调整UITableView和UICollectionView布局

    本文转载自:http://tech.techweb.com.cn/thread-635784-1-1.html 本文讲述了UITableView.UICollectionView实现 self-siz ...

  7. MVC个人认为的终极分页

    //传入要查询的字段,查询条件(例如根据姓名查看数据的数据筛选),按照什么排序,页码,信息条数 //T:要操作的类型 //Tkey:根据什么类型来排,ID的话返回的是int类型,但是name的话又会返 ...

  8. js get 传参 汉字 乱码问题

    js encodeURI(encodeURI(searchWord)) java URLDecoder.decode(searchWord,"utf-8")

  9. hdoj 5387(Clock)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5387 比较水的一道题目,也是自己单翘的第一道题目吧,题意就是找到给定时间时钟三个指针之间的夹角, 需要 ...

  10. hdoj 5326 Work

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5326 #include<stdio.h> #include<cstring> ...