网络科技

    今日:654| 主题:246247
收藏本版
互联网、科技极客的综合动态。

[其他] 讲讲你不知道的 ARC (一)

[复制链接]
另一种晚安 发表于 2016-10-4 00:05:08
265 13

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
内容提要
  通过阅读本篇文章,希望您能了解:如何在 ARC 下,强制某个变量调用指定的方法?
  前言

  首先让我们先感谢以 Blaine Garst 和 Patrick Beard 为代表的开发者。他们为 Objective-C 这门语言添加了众多特性,而其中最令人喜爱的莫过于 ARC。
  相信所有和我一样经历过手动管理内存时代的人,都会对这个特性感到非常的喜爱。
  然而,有所得必有所失。本文将会讲讲 ARC 带来的一些“麻烦”。
  一道简单的面试题

  在 MRR 环境下,下面的代码会?Compile Error / Runtime Crash / NSLog…?
  [code]//NSObject+Sun.h
@interface NSObject (Sun)
- (void)shining;
@end

//NSObject+Sun.m
@implementationNSObject (Sun)
- (void)shining
{
    NSLog(@"shining");
}

@end

//main.m
#import

int main(int argc, const char * argv[]) {
  @autoreleasepool {
      [NSObjectshining];
}
return 0;
}
[/code]   答案很简单,虽然会产生一个警告:warning: Class method '+shining' not found (return type defaults to 'id') ,但是可以正常输出 shining 。
   对此感到困惑的读者可以查看拙作 http://www.jianshu.com/p/e30977484a66
   具体到此问题,[email protected] 的文章 神经病院Objective-C Runtime住院第二天—消息发送与转发
  升级版面试题

   刚才的代码在 ARC 环境下,也能正常输出 shining 吗?
  答案是,不会。它会产生一个编译错误:exclamation:️。错误的定义如下所示。
  [code]deferr_arc_may_not_respond : Error;
[/code]  解决方案也很简单。在 main.m 文件中添加一行代码即可。
  [code]#import "NSObject+Sun.h"
[/code]  问题分析

  为什么在 MRR 下面能够正常运行的代码,却无法在 ARC 下编译呢?
  实际上,在默认情况下,在 ARC 下面进行编译时,编译器需要知道该方法是如何声明的,只有这样,编译器才能自动插入相关的内存管理代码并进行代码优化。
  那么,是否可以强制某个变量执行指定的方法呢?答案是:有。
  可以通过下面主动声明的方式,告诉编译器,请执行该方法。
  [code][[NSObjectnew] performSelector:@selector(shining)];
[NSObjectperformSelector:@selector(shining)];
[/code]  下期预告

  相信很多人都没有看明白,为什么在默认情况下,编译器需要知道方法是如何声明的?
  如果你知道原因,欢迎在下方进行评论。
  如果你感到好奇,敬请期待下期。
  打赏支持我写出更多好文章,谢谢!

     打赏支持我写出更多好文章,谢谢!

   任选一种支付方式
   
讲讲你不知道的 ARC (一)-1 (interface,defaults,warning,return,method)


讲讲你不知道的 ARC (一)-2 (interface,defaults,warning,return,method)

友荐云推荐




上一篇:What’s With All Those Rackspace Billboards?
下一篇:理解CSS模块化
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

她很可爱o 发表于 2016-10-4 01:42:09
被楼主的逻辑打败了!
回复 支持 反对

使用道具 举报

snlvb 发表于 2016-10-4 02:01:38
抢位子,坐等更新!
回复 支持 反对

使用道具 举报

咖啡香夜 发表于 2016-10-4 02:17:42
我是一楼,楼下的排队跟上。
回复 支持 反对

使用道具 举报

小小飞鱼 发表于 2016-10-4 02:31:37
楼猪V5啊
回复 支持 反对

使用道具 举报

静... 发表于 2016-10-4 02:45:39
过一百过两百,另一种晚安真的做到
回复 支持 反对

使用道具 举报

pingguo99 发表于 2016-10-4 03:01:55
我志愿加入酱油党,围观楼主搞基,挽回楼主尊严,履行回帖义务,保证经验收入,积极前排求粉,信誉有粉必回,人人粉我,我粉人人,为打酱油事业奋斗终身,随时准备为粉和酱油牺牲一切,永不潜水!
回复 支持 反对

使用道具 举报

林城绿草 发表于 2016-10-17 10:04:17
简约时尚国际范
回复 支持 反对

使用道具 举报

刘一山 发表于 2016-10-22 05:01:58
LZ敢整点更有创意的不?兄弟们等着围观捏~
回复 支持 反对

使用道具 举报

小胡侃股 发表于 2016-11-9 07:09:28
来,来,干了这杯翔!
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表