黑马程序员——IOS基础——OC内存管理ARC
来源:互联网 发布:酒店经理上班时间 知乎 编辑:程序博客网 时间:2024/05/19 19:41
------- android培训、java培训、期待与您交流!
ARC的判断准则:
只要有强指针指向对象,对象就不会被销毁,
只要有弱指针指向对象,对象就会被销毁
强指针:默认情况下,所有指针都是强指针 __strong 这里是双下划线弱指针: __weak Person *p2=[[Person alloc] init]; (这种写法没有意义,错误写法)
如果弱指针指向一个对象,那么这个对象会被销毁,弱指针指向对象不存在,把弱指针编程空指针,以防野指针
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
设置成员变量的@property属性时,默认为atomic,提供多线程安全。
在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:{lock}//加锁
if (property != newValue) {
[property release];
property = [newValue retain];
}
{unlock}//解锁atomic是OC使用的一种线程保护技术,是防止在写未完成的时候被另外一个线程读取,造成数据错误,而这种机制是耗费系统资源的。
nonatomic禁止多线程,变量保护,提高性能。
所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。
@property (nonatomic strong) Dog *dog; //人在狗在@property (nonatomic weak) Dog *dog; //Dog *d = [[Dog alloc] init];Person *p = [[Person alloc] init];p.dog = d;//如果是strong,则d=nil后,依然可以调用p.dog 如果是weak,则d=nil后,狗就不在了,则访问p.dog返回空d = nil; //人在狗在用strong总结ARC特点总结:
1.>不允许调用release、retain、retainCount
2.>允许重写dealloc,但是不允许调用[super dealloc]
3.>@property参数:
* strong :成员变量是强指针,相当于原来的retain(适用于OC对象类型),只要指针在,对象就在
* weak :成员变量是弱指针,相当于原来的assign(适用于OC对象类型)
* assign :使用与非OC对象类型
4.>以前的retain改为用strong
写法如下:
@property (nonatomic, strong) Dog *dog;@property (nonatomic, strong) NSString *name;@property (nonatomic, assign) int age;
如何:查看一个项目是否是ARC项目:在Build Settings 中搜auto,
如何:把一个项目转换成ARC项目:把所有release去掉,把retain变成strong
edit -> refactor -> convert to Object-C ARC如何:在一个ARC项目中不使用ARC:
在Build Phases中:找到不适用ARC的文件,双击/空格/回车 出现方框,输入:-fno-objc-arc
如何:在一个非ARC项目中使用ARC:
方法同上:输入:-f-objc-arc
===============================ARC循环引用=============================
在Person.h 和 Dog.h 中不能都声明strong:
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, strong) Person *person;
一端用strong,一端用weak,不限制谁用weak,这样弱指针指向的对象会先销毁,另一端若没有指针指向,则也会销毁。
@property (nonatomic, strong) Dog *dog;
@property (nonatomic, weak) Person *person;
所以,当两端循环引用的时候,解决方案:
ARC:
1端用strong,1端用weak
非ARC:
1端用retain,1端用assign
------- android培训、java培训、期待与您交流!
- 黑马程序员——IOS基础——OC内存管理ARC
- 黑马程序员——OC——ARC内存管理
- 黑马程序员——OC——ARC内存管理
- 黑马程序员——OC语言------内存管理和ARC
- 黑马程序员——IOS基础(OC内存管理)
- 黑马程序员—IOS基础之OC—内存管理
- 黑马程序员——OC基础:内存管理和自动引用计数(ARC)
- 黑马程序员——OC基础:内存管理和自动引用计数(ARC)
- 黑马程序员——OC基础---内存管理(autorelease,ARC)
- 黑马程序员——OC内存管理(非ARC,手工管理)
- 黑马程序员——OC基础——内存管理
- 黑马程序员——OC基础—内存管理
- 黑马程序员——OC基础03—内存管理
- 黑马程序员——OC基础---内存管理
- 黑马程序员——OC语言基础篇---内存管理
- 黑马程序员—OC语言基础—内存管理
- 黑马程序员——OC基础---手动内存管理
- 黑马程序员——OC基础---内存管理
- java--注解
- 如何判断应用程序运行于GUI模式还是命令行
- eclipse 导入web项目包
- csdn git使用
- Ubuntu修改当前用户用户名、密码、主文件夹名称以及主机名
- 黑马程序员——IOS基础——OC内存管理ARC
- ACM对拍程序
- 黑马程序员_多线程
- 没有WIFI让你的IPHONE通过USB连接电脑上网
- eclipse 下配置 Aptana 环境,让你的代码飞起来~
- 日600亿消息,月4.65亿用户——WhatsApp的Erlang世界
- sudo命令
- 示波器测量电源的纹波
- C#中Dictionary的用法及用途实例