iOS小技能:-fobjc-arc和 -fno-objc-arc 的使用

69 阅读2分钟

“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 29 天,点击查看活动详情

前言

在非ARC工程中集成ARC代码:

使用-fobjc-arc来标记那些通过ARC编译的第三方源代码。

在ARC工程中集成非ARC的第三方代码,编译库里面的文件需要使用-fno-objc-arc

// E192DF9B1F68C4AB00509A7D /* OpenUDID.m in Sources / = {isa = PBXBuildFile; fileRef = E192DF9A1F68C4AB00509A7D / OpenUDID.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; };

常见错误:

--Cast of an indirect pointer to an Objective-C pointer to 'CFTypeRef *' (aka 'const void **') is disallowed with ARC

I ARC 简介

ARC 是编译器特性,而不是IOS运行时特性,它也不类似于其他语言的垃圾收集器(GC)

1.1 ARC的规则

只要还有一个变量指向对象,对象就会保持在内存中-- 默认所有的实例变量和局部变量都是strong指针,因为它们能保持对象的生命。

1.2 OC中有强参照strong和弱参照weak。

__weak型的指针变量仍然可以指向一个对象,但不属于这个对象的拥有者;weak指针主要用于父子关系,即父亲拥有一个儿子的strong指针,儿子需使用weak指针指向父亲。

  • 典型的例子: 你的ViewControl通过strong指针(self.view)拥有一个UITableView,UITableView的dataSource和delegate都是weak指针,指向你的viewControl
 @property(null_resettable, nonatomic,strong) UIView *view;
 
  
 
 @property (nonatomic, weak, nullable) id <UITableViewDelegate> delegate;
 

在ARC(代码的一种静态分析工具)中dealloc 主要用于调试,判断对象被释放。可以用来管理一些资源,不能调用[super dealloc]

*** an implementation of dealloc, do not invoke the superclass’s implementation

*** 在ARC下父类的dealloc同样由编译器自动完成,不能用来释放实例变量;

  • 在ARC中考虑的是对象之间的关联

无论何时创建一个对象,都要考虑谁该拥有它,以及这个对象需要存活多久。

1.3 ARC只能工作于OC。

如果应用了core foundation,malloc()、free(),此时还是需要你来手动管理。 即CF数据类型在ARC、MRC中都需要手动释放。