OC语言—— 内存管理原则

1.内存的创建和释放

   让我们以Object-c世界中最最简单的申请内存方式展开,谈谈关于一个对象的生命周期。首先创建一个对象:

   此时,对于对象“testObject”来说,他的引用计数就是1了,原因就是他调用了alloc来创建了一块只属于他的内        存,这样对象的引用计数 就得+1. 另外,Object-c中的另两个关键字retain和copy也会将对象的引用计数+1.根     据Object-c的内存管理机制,我们在使用完 “testObject”后,需要释放它。

    release后的对象,虽然已经释放,但是他的指针地址仍然存在,只是指向了一块已经释放且无用的内存,所以我     们建议release后直接赋个nil来置空。

   一般,如果我们能知道需要实现功能所涉及的“className”的具体类名,就不建议使用init方法去初始化,比如以    下代码:

<span style="font-size:24px;"> NSString *strTest = [NSString alloc] initWithString:@"test"];//(推荐)
 NSString *strTest = [NSString alloc] init]; //(不推荐)</span>

2.类方法和实例方法

   简单来说,实例方法就是得有了具体实例(对象)后才能使用的方法,一般以减号形式作为方法的前缀来声明,比    如API定义

<span style="font-size:24px;">   - (id)initWithString:(NSString *)aString;</span>

    相比而言,类方法则无需具体对象,只需要类的名称即可调用,一般以加号形式作为方法的前缀来声明,比如API      定义:

<span style="font-size:24px;">  +(id)stringWithString:(NSString *)aString;</span>

    大可以将类方法理解为静态方法,类方法在对象还没创建出来之前已经有了。

3.属性关键字

<span style="font-size:24px;">   @property (nonatomic, assign) int B;
   @property (nonatomic, retain) id classObj;</span>

    可以看到关键之@property后的括号出现了四个特征性关键字:nonatomic , assign , retain , settet, 这些关     键字直接告诉编译器后面的变量用何种方式来存取。

    关于nonatomic,如果我们能确定不需要多线程访问时,强烈推荐使用这个关键字,因为atomic对于性能的损失相     对较大

    如果是类的delegate,推荐使用assign关键字,原因是避免了retain的死循环造成的对象无法真正的释放

3.ARC新增关键字 

   ARC新增两个武功高强的左右护法:strong 和 weak

   strong的含义和retain相同,weak和assign相同,修饰完的属性变量用法也是完全没有改变,不过strong和          weak只能修饰对象。

   

   苹果官方对于ARC机制中对象的内存引用规则:

    (1)任何对象,如果仍有持有者,就不会销毁

    (2)任何对象,已经没有任何持有者,即自动销毁

  持有者就是指向对象的指针,如果是strong修饰的,即是对象的持有者,如果是weak属性的,则不是持有者

4.ARC机制的使用规则

   对于ARC机制的使用,苹果发布了几条重要的规则需要开发者遵守。单单看那些生搬硬套的东西难免生涩,根据开    发经验将规则总结如下:

   (1)不能调用dealloc,不能重写和调用retain,release,retainCount 和autorelease,同理,      @selector(retain),@selector(release)这些曲线救国的方法也不能调用。 dealloc虽然能够重写,但是不能调用     [super dealloc]之类的方法,CoreFoundation框架由于非从属cocoa框架,所以CFRetain和CFRelease仍然正常  使用。

   (2)不能使用NSAllocateObjec或NSDeallocateObject函数来创建对象

   (3)不能在C语言的结构体中使用对象指针,同时建议用object-c的类来管理数据而不是结构体

   (4)不得使用NSAutoreleasePool对象。ARC中,全部使用@autorelease关键字代替,且比NSAutoreleasePool    更高效

   (5)不得使用内存Zone,那些牵涉NSZone的方法都不得使用。

   (6)不得对一个属性变量的取值方法命名以new开头

   (7)outlet均用weak关键字修饰,除非他是xib中最顶部的界面元素,则需要strong。

   (8)Core Foundation不适合ARC,该创建的仍创建,该释放的仍释放。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值