讲讲你不知道的 ARC (一)

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

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

下期预告

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

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

时间: 2024-11-07 21:11:31

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

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

一定要注意,我们运行app时,一定要关心内存的使用,尽量不要超过20M,即使有很多图片要显示也绝对不能超过30M.所以运行自己开发的app时多关心内存的使用是个很好的习惯. 对于性能,内存的优化,这个涉及的就太多了.现在先讲讲几个最基本常见的内存泄露下的解决方法. 1. instruments instrument可以报出不少内存泄露的错误,方法:http://www.cocoachina.com/ios/20141203/10519.html,很容易操作. 不过它最大的功能还是可以自己看出哪里

iOS之内存管理(ARC)

iOS的内存管理,相信大家都不陌生,之前是使用的MRC,由开发人员手动来管理内存,后来使用了ARC,来由系统管理内存.本文主要讲讲Autorelease,Core Foundation对象在内存管理方面要注意的地方. Autorelease 提到内存管理,就不得不提autorelease,虽然我们平时开发中很少会感知到它的存在.autorelease就是自动释放的意思,如果变量使用autorelease来修饰,就表明变量的释放由系统来完成. autoreleasepool是由runloop在开启

你不知道的Canvas(二)

你不知道的Canvas(二) 一.色彩Colors 到目前为止,我们只看到过绘制内容的方法.如果我们想要给图形上色,有两个重要的属性可以做到:fillStyle 和 strokeStyle. fillStyle = color 设置图形的填充颜色. strokeStyle = color 设置图形轮廓的颜色. color 可以是表示 CSS 颜色值的字符串,渐变对象或者图案对象.默认情况下,线条和填充颜色都是黑色(CSS 颜色值 #000000). 输入的应该是符合 CSS3 颜色值标准 的有效

ARC

ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting).简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了. 该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可以使用该机能.简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码.有一点,ARC并不是G

Block的引用循环问题 (ARC & non-ARC)

Block实现原理 首先探究下Block的实现原理,由于Objective-C是C语言的超集,既然OC中的NSObject对象其实是由C语言的struct+isa指针实现的,那么Block的内部实现估计也一样,以下三篇Blog对Block的实现机制做了详细研究: A look inside blocks: Episode 1 A look inside blocks: Episode 2 A look inside blocks: Episode 3 虽然实现细节看着头痛,不过发现Block果然

你不知道的JavaScript--Item23 定时器的合理使用

1.定时器概述 window对象提供了两个方法来实现定时器的效果,分别是window.setTimeout()和window.setInterval.其中前者可以使一段代码在指定时间后运行:而后者则可以使一段代码每过指定时间就运行一次.它们的原型如下: window.setTimeout(expression,milliseconds); window.setInterval(expression,milliseconds); 其中,expression可以是用引号括起来的一段代码,也可以是一个

MRC与ARC混合开发配置

iOS4.1后,默认为ARC模式,ARC实质上通过编译器特性实现的,只需简单修改下文件配置即可实现. 1.要切换至MRC需要选中当前Project,选择Build Settings,查询框内键入auto,查找到Objective-C Automatic Reference Counting ,将YES选成NO即可.见下图: 2.还可以灵活选择单一或几个文件设置成ARC模式,方法是选择targets,找到Compile Sources,选择所需文件,将flags ,键入-fobjc-arc即可.见

iOS ARC机制

iOS提供了ARC功能,很大程度上简化了内存管理的代码. 1.ARC的本质: 采用ARC后,iOS开发者完全可以抛弃之前繁琐的内存管理机制.在开启ARC的情况下,编译器会自动的在程序的正确位置隐式的插入retain,release和autorelease等.特别明确,ARC只是objective-C编译器的特征,所有ARC相关处理都会发生在构建应用程序的时候,这和内存垃圾回收机制不同. 2.基本的ARC使用规则 1)代码中不能使用retain,release,autorelease等: 2)不能

黑马程序员--ARC

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- ARC的判断准则:只要没有强指针指向的对象,就会释放对象 ARC特点: 1>不允许调用release,release,retainCount 2>允许重写dealloc,但是不允许调用[super dealloc] 3>@property的参数 * strong :成员变量时强指针,(适用于OC对象类型) * weak :  成员变量是若指针,(适用于OC对象) * assign: 适