精华内容
下载资源
问答
  • ARC

    2015-10-31 01:00:40
    1、指针分类 (1)强指针:默认的情况下,所有的指针都是强指针,关键字strong (2)弱...Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入 的最大的变革和最激动人心的变化。ARC是新的LLVM 3

    1、指针分类
    (1)强指针:默认的情况下,所有的指针都是强指针,关键字strong (2)弱指针:_ _weak关键字修饰的指针
    声明一个弱指针如下:
    _ _weak Person *p;

    2、什么是ARC?
    Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入 的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,可以说一 举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。
    在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和 autorelease三个关键字就好~这是ARC的基本原则。
    当ARC开启时,编译器将自动在代码合适的地方插入retain, release和autorelease,而作为 开发者,完全不需要担心编译器会做错(除非开发者自己错用ARC了)。
    手动管理内存, 可以简称MRC (Manual Reference Counting)
    ARC与其他语言的”垃圾回收”机制不同。ARC:编译器特性;“垃圾回收”运行时特性

    3、ARC工作原理及判断准则
    ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是 在代码编译时为你自动在合适的位置插入release或autorelease,
    ARC的判断准则: 只要没有强指针指向对象,对象就会被释放。
    注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了。

    二、 ARC下循环引用问题
    循环引入的对象中其中一个对象设置为strong 另一个设置为weak

    1、ARC下@property参数
    ARC中的@property
    strong : 用于OC对象, 相当于MRC中的retain
    weak : 用于OC对象, 相当于MRC中的assign
    assign : 用于基本数据类型, 跟MRC中的assign一样
    copy : 一般用于NSString, 跟MRC中的copy一样 在ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak。

    1、ARC特点总结
    (1)不允许调用release,retain,retainCount (2)允许重写dealloc,但是不允许调用[super dealloc] (3)@property的参数:
    strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针 weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针 assign:适用于非OC对象类型(基础类型)
    2、ARC使用注意事项
    1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。

    2)__weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释 放掉后,ARC把指针设置为nil。 3)ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再
    [super dealloc]。
    @property(nonatomic,strong)Dog *dog;
    // 意味着生成的成员变量dog是一个强指针,相当于以前的retain。 4)如果换成是弱指针,则换成weak,不需要加 _。

    1、ARC模式下如何兼容非ARC的类
    让程序兼容ARC和非ARC部分。转变为非ARC -fno-objc-arc 转变为ARC的, -f-objc-arc 。

    展开全文
  • arc

    2014-04-22 10:27:58
    什么是ARC Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,可以说一举解决了广大iOS开发者所...
    什么是ARC

    Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,可以说一举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。

    在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和autorelease三个关键字就好~这是ARC的基本原则。当ARC开启时,编译器将自动在代码合适的地方插入retain, release和autorelease,而作为开发者,完全不需要担心编译器会做错(除非开发者自己错用ARC了)。好了,ARC相当简单吧~到此为止,本教程结束。

    等等…也许还有其他问题,最严重的问题是“我怎么确定让ARC来管理不会出问题?”或者“用ARC会让程序性能下降吧”。对于ARC不能正处理内存管理的质疑自从ARC出生以来就一直存在,而现在越来越多的代码转向ARC并取得了很好的效果,这证明了ARC是一套有效的简化开发复杂程度的机制,另外通过研究ARC的原理,可以知道使用ARC甚至能提高程序的效率。在接下来将详细解释ARC的运行机理并且提供了一个step-by-step的教程,将非ARC的程序转换为ARC。


    ARC工作原理

    手动内存管理的机理大家应该已经非常清楚了,简单来说,只要遵循以下三点就可以在手动内存管理中避免绝大部分的麻烦:

    如果需要持有一个对象,那么对其发送retain 如果之后不再使用该对象,那么需要对其发送release(或者autorealse) 每一次对retain,alloc或者new的调用,需要对应一次release或autorealse调用

    初学者可能仅仅只是知道这些规则,但是在实际使用时难免犯错。但是当开发者经常使用手动引用计数 Manual Referecen Counting(MRC)的话,这些规则将逐渐变为本能。你会发现少一个release的代码怎么看怎么别扭,从而减少或者杜绝内存管理的错误。可以说MRC的规则非常简单,但是同时也非常容易出错。往往很小的错误就将引起crash或者OOM之类的严重问题。

    在MRC的年代里,为了避免不小心忘写release,Xcode提供了一个很实用的小工具来帮助可能存在的代码问题(Xcode3里默认快捷键Shift+A?不记得了),可以指出潜在的内存泄露或者过多释放。而ARC在此基础上更进一步:ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是在代码编译时为你自动在合适的位置插入release或autorelease,就如同之前MRC时你所做的那样。因此,至少在效率上ARC机制是不会比MRC弱的,而因为可以在最合适的地方完成引用计数的维护,以及部分优化,使用ARC甚至能比MRC取得更高的运行效率。

    ARC机制

    学习ARC很简单,在MRC时代你需要自己retain一个想要保持的对象,而现在不需要了。现在唯一要做的是用一个指针指向这个对象,只要指针没有被置空,对象就会一直保持在堆上。当将指针指向新值时,原来的对象会被release一次。这对实例变量,sunthesize的变量或者局部变量都是适用的。比如




    • NSString *firstName = self.textField.text; 

    firstName现在指向NSString对象,这时这个对象(textField的内容字符串)将被hold住。比如用字符串@“OneV”作为例子,这个时候firstName持有了@”OneV”。

    211507693.png

    当然,一个对象可以拥有不止一个的持有者(这个类似MRC中的retainCount>1的情况)。在这个例子中显然self.textField.text也是@“OneV”,那么现在有两个指针指向对象@”OneV”(被持有两次,retainCount=2,其实对NSString对象说retainCount是有问题的,不过anyway~就这个意思而已.)。

    211538170.png

    过了一会儿,也许用户在textField里输入了其他的东西,那么self.textField.text指针显然现在指向了别的字符串,比如@“onevcat”,但是这时候原来的对象已然是存在的,因为还有一个指针firstName持有它。现在指针的指向关系是这样的:

    211605437.png

    只有当firstName也被设定了新的值,或者是超出了作用范围的空间(比如它是局部变量但是这个方法执行完了或者它是实例变量但是这个实例被销毁了),那么此时firstName也不再持有@“OneV”,此时不再有指针指向@”OneV”,在ARC下这种状况发生后对象@”OneV”即被销毁,内存释放。

    211630454.png

    类似于firstName和self.textField.text这样的指针使用关键字”strong”进行标志,它意味着只要该指针指向某个对象,那么这个对象就不会被销毁。反过来说,ARC的一个基本规则即使,只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁。在默认情况下,所有的实例变量和局部变量都是strong类型的。可以说strong类型的指针在行为上和MRC时代retain的property是比较相似的。

    既然有”strong”,那肯定有”weak”咯~weak类型的指针也可以指向对象,但是并不会持有该对象。比如:






    • __weak NSString *weakName = self.textField.text 


    得到的指向关系是:

    211656973.png

    这里声明了一个weak的指针weakName,它并不持有@“onevcat”。如果self.textField.text的内容发生改变的话,根据之前提到的“只要某个对象被任一strong指针指向,那么它将不会被销毁。如果对象没有被任何strong指针指向,那么就将被销毁”原则,此时指向@“onevcat”的指针中没有strong类型的指针,@”onevcat”将被销毁。同时,在ARC机制作用下,所有指向这个对象的weak指针将被置为nil。这个特性相当有用,相信无数的开发者都曾经被指针指向已释放对象所造成的EXC_BAD_ACCESS困扰过,使用ARC以后,不论是strong还是weak类型的指针,都不再会指向一个dealloced的对象,从根源上解决了意外释放导致的crash。

    211721950.png

    不过在大部分情况下,weak类型的指针可能并不会很常用。比较常见的用法是在两个对象间存在包含关系时:对象1有一个strong指针指向对象2,并持有它,而对象2中只有一个weak指针指回对象1,从而避免了循环持有。一个常见的例子就是oc中常见的delegate设计模式,viewController中有一个strong指针指向它所负责管理的UITableView,而UITableView中的dataSource和delegate指针都是指向viewController的weak指针。可以说,weak指针的行为和MRC时代的assign有一些相似点,但是考虑到weak指针更聪明些(会自动指向nil),因此还是有所不同的。细节的东西我们稍后再说。

    211745323.png

    注意类似下面的代码似乎是没有什么意义的:

    1. __weak NSString *str = [[NSString alloc] initWithFormat:…]; 

    2. NSLog(@"%@",str); //输出是"(null)"
    复制代码

    由于str是weak,它不会持有alloc出来的NSString对象,因此这个对象由于没有有效的strong指针指向,所以在生成的同时就被销毁了。如果我们在Xcode中写了上面的代码,我们应该会得到一个警告,因为无论何时这种情况似乎都是不太可能出现的。你可以把weak换成strong来消除警告,或者直接前面什么都不写,因为ARC中默认的指针类型就是strong。

    property也可以用strong或weak来标记,简单地把原来写retain和assign的地方替换成strong或者weak就可以了。

    1. @property (nonatomic, strong) NSString *firstName; 

    2. @property (nonatomic, weak) id delegate;
    复制代码

    ARC可以为开发者节省很多代码,使用ARC以后再也不需要关心什么时候retain,什么时候release,但是这并不意味你可以不思考内存管理,你可能需要经常性地问自己这个问题:谁持有这个对象?

    比如下面的代码,假设array是一个NSMutableArray并且里面至少有一个对象:

    1. id obj = [array objectAtIndex:0]; 

    2. [array removeObjectAtIndex:0]; 

    3. NSLog(@"%@",obj);
    复制代码

    在MRC时代这几行代码应该就挂掉了,因为array中0号对象被remove以后就被立即销毁了,因此obj指向了一个dealloced的对象,因此在NSLog的时候将出现EXC_BAD_ACCESS。而在ARC中由于obj是strong的,因此它持有了array中的首个对象,array不再是该对象的唯一持有者。即使我们从array中将obj移除了,它也依然被别的指针持有,因此不会被销毁。

    一点提醒

    ARC也有一些缺点,对于初学者来说,可能仅只能将ARC用在objective-c对象上(也即继承自NSObject的对象),但是如果涉及到较为底层的东西,比如Core Foundation中的malloc()或者free()等,ARC就鞭长莫及了,这时候还是需要自己手动进行内存管理。在之后我们会看到一些这方面的例子。另外为了确保ARC能正确的工作,有些语法规则也会因为ARC而变得稍微严格一些。

    ARC确实可以在适当的地方为代码添加retain或者release,但是这并不意味着你可以完全忘记内存管理,因为你必须在合适的地方把strong指针手动设置到nil,否则app很可能会oom。简单说还是那句话,你必须时刻清醒谁持有了哪些对象,而这些持有者在什么时候应该变为指向nil。


    ARC必然是Objective-C以及Apple开发的趋势,今后也会有越来越多的项目采用ARC(甚至不排除MRC在未来某个版本被弃用的可能),Apple也一直鼓励开发者开始使用ARC,因为它确实可以简化代码并增强其稳定性。可以这么说,使用ARC之后,由于内存问题造成的crash基本就是过去式了(OOM除外 )


    我们正处于由MRC向ARC转变的节点上,因此可能有时候我们需要在ARC和MRC的代码间来回切换和适配。Apple也想到了这一点,因此为开发这提供了一些ARC和非ARC代码混编的机制,这些也将在之后的例子中列出。另外ARC甚至可以用在C++的代码中,而通过遵守一些代码规则,iOS 4里也可以使用ARC(虽然我个人认为在现在iOS 6都呼之欲出的年代已经基本没有需要为iOS 4做适配的必要了)、

    总之,聪明的开发者总会尝试尽可能的自动化流程,已减轻自己的工作负担,而ARC恰恰就为我们提供了这样的好处:自动帮我们完成了很多以前需要手动完成的工作,因此对我来说,转向ARC是一件不需要考虑的事情。


    原文链接:http://blog.sina.com.cn/s/blog_801997310101a72g.html

    展开全文
  • ARC项目中, 可以指定哪一些class不使用ARC的, 具体操作是 点击项目 - Build Phases - Compile Sources中, 双击class文件, 编辑Compiler Flags加入 -fno-objc-arc   如何在未使用arc的工程中引入一个使用了arc...

    在ARC项目中, 有一些class不使用ARC的, 具体操作是

    点击项目 - Build Phases - Compile Sources中, 双击class文件, 编辑Compiler Flags加入 -fno-objc-arc 

     

    在未使用arc的工程中,引入一个使用了arc特性的文件:

    选中工程->TARGETS->相应的target然后选中右侧的“Build Phases”,向下就找到“Compile Sources”,然后对对相应的文件添加:-fobjc-arc参数



    1,选择项目中的Targets,选中你所要操作的Target,
    2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,
         并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-fno-objc-arc

    展开全文
  • arc 与非arc

    2014-03-28 11:19:39
    Xcode 项目中我们可以使用 ARC 和非 ARC 的混合模式。 如果你的项目使用的非 ARC 模式,则为 ARC 模式的代码文件加入 -fobjc-arc 标签。 如果你的项目使用的是 ARC 模式,则为非 ARC 模式的代码文件加入 -fno-...

    Xcode 项目中我们可以使用 ARC 和非 ARC 的混合模式。

    如果你的项目使用的非 ARC 模式,则为 ARC 模式的代码文件加入 -fobjc-arc 标签。

    如果你的项目使用的是 ARC 模式,则为非 ARC 模式的代码文件加入 -fno-objc-arc 标签。

    添加标签的方法:

    1. 打开:你的target -> Build Phases -> Compile Sources.
    2. 双击对应的 *.m 文件
    3. 在弹出窗口中输入上面提到的标签 -fobjc-arc / -fno-objc-arc
    4. 点击 done 保存
    展开全文
  • ARC兼容NoARC

    千次阅读 2014-02-01 09:54:08
    在xcode5.0以后,我们创建的项目默认就是ARC项目,如果要改为NoARC,只需修改automatic reference counting 为NO就可以了,Xcode也为老的arc项目提供了便捷,一键转为arc项目。 我们点中项目然后,点击edit-->...
  • ARC与非ARC

    2014-10-23 15:53:26
    fobic-arc支持ARC -fno-objc-ar 不支持ARC
  • 在非ARC工程中集成ARC代码: 使用-fobjc-arc来标记那些通过ARC编译的第三方源代码。 在ARC工程中集成非ARC的第三方代码,编译库里面的文件需要使用-fno-objc-arc 。常见错误: --Cast of an indirect ...
  • 浅析ARC

    千次阅读 2016-04-20 11:32:03
    浅析ARC
  • ARC与非ARC在一个项目中同时使用, 选择项目中的Targets,选中你所要操作的Target,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-fno-objc-...
  • 用-fno-objc-arc标记来禁用在ARC工程那些不支持ARC的文件的ARC, 用-fobjc-arc标记启用非ARC工程中支持ARC的文件
  • ARC和非ARC模式

    2014-04-29 10:47:07
    Xcode项目中我们可以使用ARC和非ARC的混合模式 如果你的项目使用的是非ARC模式,则为ARC模式的代码文件加入-fobjc-arc 标签。 如果你的项目使用的是ARC模式,则为ARC模式的代码文件加入 -fno-objc-arc 标签。 ...
  • arc转非arc

    2014-05-30 09:11:28
    1,选择项目中的Targets,选中你所要操作的Target, 2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击, 并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-fno-objc-arc
  • 1.ARC引用非ARC需要增加的参数:-fno-objc-arc 1.ARC引用非ARC需要增加的参数:-fno-objc-arc
  • arc to no arc

    2013-08-22 11:18:50
    如何在未使用arc的工程中引入一个使用了arc特性的文件:对相应的文件添加:-fobjc-arc参数  相反 :-fno-objc-arc
  • 一、项目使用的非ARC模式,则为ARC模式的代码文件加入-fobjc-arc标签。 二、项目使用的ARC模式,则为非ARC模式的代码文件加入 -fno-objc-arc标签。 三、添加标签的方法: Frst step 、打开:你的target - Bulid ...
  • ARC/非ARC的设置

    2015-12-31 00:46:55
    如果你的项目使用的非 ARC 模式,则为 ARC 模式的代码文件加入 -fobjc-arc 标签。 如果你的项目使用的是 ARC 模式,则为非 ARC 模式的代码文件加入 -fno-objc-arc 标签。 添加标签的方法: 打开:你的...
  • ARC与非ARC混用

    2016-01-13 15:24:36
    ARC与非ARC在一个项目中同时使用 1,选择项目中的Targets,选中你所要操作的Target, 2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-...
  • from arc_loss import ArcLoss weight = 1 save_path = r".\model_data\{}\train{}.pth" save_pic_path = "img17" if __name__ == '__main__': net = TrainNet() device = t.device("cuda:0" if t.cuda.is_...
  • 1.自己的旧项目没有使用ARC,但是引入的第三方库却是使用了ARC的。 2.自己的新项目使用了ARC,但是引入的第三方库或者以前写的代码却没有使用ARC。 这两种情况下,直接肯定是通不过编译的。可以通过升级旧项目,让...
  • ARC转换

    2015-12-10 00:46:30
    一、使项目中部分代码兼容非ARC的方法: 1、点击项目 2、点击Build Phases,点开Compile Sources 找到需要更改的.m文件,双击文件,输入-fno-objc-arc,回车就ok了。 (若要改为arc代码,将口令改为-f-objc--...
  • ios ARCARC 转换

    2013-09-05 10:16:48
     ARC ===》非ARC -fobjc-arc  非ARC ===》ARC -fno-objc-arc 添加标签的方法: 1.打开target===》Build Phases ==> Compile Sources 2.双击对应的.m文件 3.在弹出窗口里输入要的标签:-
  • -fobjc-arc,使ARC与非ARC一块工作  ARC与非ARC在一个项目中同时使用, 1,选择项目中的Targets,选中你所要操作的Target, 2,选Build Phases,在其中Complie Sources中选择需要ARC的文件...
  • 混合使用 ARC 和非ARC

    2015-03-10 14:07:04
    ios 5 新建项目的时候默认勾选ARC内存管理机制,因此项目中不能使用 retain,release,autorelease等内存处理的方法。 要想在程序中手动管理内存可以: 如果你的项目使用的非 ARC 模式,则为 ARC 模式的代码文件...
  • ARC简介以及工程中ARC与非ARC的混合 ARC与非ARC在一个项目中同时使用, 1,选择项目中的Targets,选中你所要操作的Target, 2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并在...
  • ARC入门

    千次阅读 2015-04-23 14:11:56
    在chrome上,通过ARC运行,调试app。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 150,133
精华内容 60,053
关键字:

arc