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
所有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