黑马程序员IOS-OC语言-内存管理、ARC

——- android培训、java培训、期待与您交流! ———-


内存管理

内存管理 : 管理继承了 NSObject 的对象,对于基本数据类型无效

原理 : 对象 --内部--> 引用计数器 
       默认创建对象时引用计数器 = 1; 为 0 时内存被释放

关联方法

retain : 计数器 + 1

release : 计数器 - 1

retainCount : 获取当前计数器的值

dealloc : 当引用计数器为 0 时,对象被销毁,对象会最后调用 dealloc 方法

  • 一般会重写 dealloc 方法。但一定不要自己调用 dealloc 方法

内存管理原则

1> 谁创建,谁释放。谁通过 alloc、new或(mutable)copy 创建对象,谁 release 或 autorelease.

2> 谁 retain ,谁 release。 谁加了,谁减回去

@property参数 : 类的成员定义的时候设置参数

1.set方法内存管理的参数
* retain    : release 旧值,retain 新值
* assign    : 直接赋值(默认,适用于非OC对象类型)
* copy      : release 旧值,copy新值

2.是否要生成set方法
* readwrite : 同时生成setter和getter方法的声明和实现(默认)
* readonly  : 只生成 getter 方法的声明和实现

3.多线程管理
* nonatomic : 性能高
* atomic    : 性能低(默认)

4.setter和getter方法的名称
* setter    : 决定了set方法的名称 , 一定要有冒号 : (一般不使用)
* getter    : 决定了get方法的名称(一般用在BOOL类型)

声明非OC对象

@property (nonatomic ,assign) int xxxx;

声明OC对象

@property (nonatomic ,retain) Yyy *yyy;

id 对象

@property (nonatomic ,retain) id xxx;

@class

@class : 只标识类名
如:@class Person;    // 仅仅告诉编译器,Person是一个类

开发中引用的一个类的规范

1> 在 .h 文件中用 @class 来声明类
2> 在 .m 文件中用 #import 来包含需要调用的类的 .h 文件

两端循环引用的解决方法

一端用 retain ; 一端用 assign

autorelease

1. 会将对象放到一个自动释放池中
2. 调用完 autorelease 方法后,对象的引用计数器不变
3. 方法调用后会返回对象本身
4. 当自动释放池被销毁时,会对池中所有对象指向一次release操作

注:调用了几次 autorelease 方法,释放池销毁时,执行几次 release 操作

autorelease 的好处:不用关心对象何时释放、以及何时调用 release 方法

autorelease 使用注意:

因为不能准确的控制对象回收时间,所以运行占用内存较大的对象会对内存造成负担。

错误写法:

1> 调用 alloc 方法之后调用了 autorelease 方法,又调用了 release 方法
@autoreleasepool{
    Person *p = [ [ [Person alloc] init] autorelease];  // 引用计数器 = 1

    [p release];    // 引用计数器 = 0
}   // 引用计数器 - 1 ,造成野指针错误

———————

2> 连续多次调用 autorelease 方法
@autoreleasepool{
    // 引用计数器 = 1
    Person *p = [ [ [ [Person alloc] init] autorelease] autorelease];
} // 引用计数器 -1 ,造成野指针错误

———————

自动释放池的创建方式

1> IOS 5.0之前
NSAutoreleasePool *pool = [ [NSAutoreleasePool alloc] init];

/*自动释放池(从NSAutoreleasePool对象创建到release)*/

[pool release]; // [pool drain];    // 淘汰的回收方法 drain

2> IOS 5.0及以后

@autoreleasepool
{
    /*      自动释放池(大括号两端为起止)     */
}

———————

autorelease 其他说明

系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是调用过 autorelease 方法的。

开发中经常会提供一些类方法,用于快速创建一个已经调用过 autorelease方法的对象,创建对象的方法中一般使用 self ,提高扩展性
+ (id) Xxxx
{
return [ [ [self alloc] init] autorelease];
}


ARC

ARC : IOS 5 之后加入的编译器特性,较于其他语言的垃圾回收(运行时特性)更加高效

规则 : 只要还有一个强指针变量指向对象,对象就会保持在内存中

指针类型

强指针 : 默认所有实例变量和局部变量都是强指针 strong
弱指针 : 弱指针指向的对象被回收后,弱指针会自动变为 nil 指针,不会引起野指针错误

使用注意

ARC 后不能调 release、retain、autorelease、retainCount 等方法
可以重写 dealloc 方法,但是不能调用 [super dealloc];
ARC 后,两端互相引用时,一端用 strong 、一端用 weak

@property 参数

* strong : 成员变量是强指针 (适用于 OC 对象类型)
* weak   : 成员变量是弱指针 (适用于 OC 对象类型)
* assign : 直接赋值 (适用于 非OC 对象类型)

@property : 想长期拥有某个对象,应该用 strong,其他对象用 weak

定义指针是可以设置指针类型,在类名前加关键字

__strong 强指针
__weak   弱指针

——- android培训、java培训、期待与您交流! ———-

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值