OC中手动管理内存

1.基本数据类型不需要管理内存
所有OC的对象都有一个计数器,这个计数器我们称为引用计数
当引用计数为0时,说明没有人使用此对象,此对象会被系统销毁,销毁之前自动调用此对象的dealloc方法
alloc用来创建对象,创建完成后,引用计数为1,只调用1次。
retain使引用计数+1,release使引用计数-1;且可以多次调用




2.黄金法则:
如果一个对象使用了alloc,[mutable]copy,retain
那么你必须使用相应的release或者autorelease释放




3.持有对象的两种方法:
(1).set方法持有对象的所有权
-(void)setDog:(Dog)dog
{
if(_dog!=dog)
{
[_dog release];
_dog=[dog retain];
}
}
(2).自定义初始化方法,持有对象的所有权
-(id)initWithDog:(Dog*)dog   只会调用一次  不需要判断
{
self=[super init];
if(self!=super)
{
_dog=[dog retain];
}
return self;
}


(3).dealloc方法(此方法在计数为0时默认调用,没有的话调用NSObject的)
-(void)dealloc
{
[_dog release];
[_car release];
[super deallc];
}


4.alloc 时的计数为其本身 为1


5.在给全局对象赋值的时候,需要将此对象retain
  在dealloc中对全局的对象都release
  每次程序结尾时都要记住销毁对象 调用release  这个用释放池自动解决吧




疑问点:为啥最后都release后还是1  [super dealloc]会销毁此对象吗  
这是编译器的一个漏洞  但调用对象会报错
  
疑问点:retain的能autorlease? 比如property创建的set、get方法
这也是可以的 
疑问点:解释下嵌套使用的报错点 顺序?
      他把它里面的池子也释放掉了
疑问点:没有定义释放池时[p1 autoreleas]是调用谁的池
系统默人的
疑问点:[_agent name]  为什么不能用点语法
id类型
=========================================================


6.property可以为一个属性自动生成set和get方法,不需要我们手动编写
@property(nonatomic,retain,readwrite)NSString *userName;   不需要在定义属性  这是一个方法
第一个参数: atomic   多线程环境下存在线程保护,默认
 nonatomic 多线程环境下,不存在县城保护
第二个参数: assign  直接赋值,默认  没有内存处理  适用于 常量与代理的使用
 retain   设置器内存处理  retain 获得  保留对象
 copy     设置器内存处理  copy 获得   拷贝对象 常用于字符串
第三个参数: readwrite  生成getter、setter方法 默认
 readonly   只生成getter方法


我们也可以重新定义一个set、get方法 优先调用自己的方法


属性会添加,放心调用 注意 书写的时候没加(_) 调用属性的时候记得添加


将生成的属性名更改为$username
@synthesize username=$userName;
===================================================================
自动释放池和@property有相似的道理


7.自动释放池
自动释放池的创建与加入
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
User *user=[[User alloc]init];
[user autorelease];  //加入自动释放池
[pool release];   //自动释放池释放
 自动释放池销毁时,会对池中的每个对象发送一条release消息   
autorelease 会将对象添加到离它最近的自动释放池
新语法创建自动释放池
@autoreleasepool     等价于 NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
{
User *user=[[User alloc]init];
[user autorelease];
}     等价于[pool release];


//[pool drain] drain 会对池子中的每个对象发送送release


8.加入释放池后,就不需要单个释放了  到时释放池子就行了 
  每一个对象的生成,都要加入释放池   简便的方法:Car *car=[[[Car alloc]init]autorelease];
  alloc方法的池子记得加入  类方法的创建已自动加入池子  新语法的创建 也是自动加入池子
   aloc加入 autorelease  等价与对象类方法创建
新语法:NSArray *array=@[@"zhangsan",@"lisi"];
       NSNumber *number=@123;


9.新版的编译器支持自动管理内存  选择使用 Use Automatic Reference Counting


10.循环引用导致两个对象都无法销毁掉   选择一个对象 属性assin直接赋值即可  代理都使用assin


11.NSTimer 定时器开始时会让对象的计数加1 inValidate时会让对象的计数减1


12.记住黄金法则


13.指针变量在栈区  对象在堆区   常量在常量区 伴随整个程序的结束


代码区 代码的二进制
静态存储区 全局变量 伴随整个程序的结束
Person *p=[[Person alloc]init]; 这个不管release多少次引用计数都为1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值