------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
.m文件
5当对象的retainCount为0时,dealloc会自动调用,释放对象内存,否则分配给对象的内存将被一直占用
NSString *str=@"hello";
内存释放原则
1 对象又创建,就会又摧毁,而且使用后,应立即relesse
2.凡是出现alloc copy retain的地方,都会有一个release或autorelease对应
3用便利构造器创建的对象不能用release,该对象由autorelease管理内存;
4一定不要释放没有所有权的对象
几个关键字可能影响到内存管理(影响内存或者内存记数)
retain 不影响 影响
release 不影响 影响
alloc 影响 影响
doalloc 释放 影响(将实例变量清零)
autorelease 不影响 (自动释放池结束时,进行-1动作)
assign 不影响 不影响
设置器的重现
当你写在.h文件写了@property(retain,nonatomic)Student *stu;
在.文件中写了 @synthesize stu;
系统将自动生成
自动生成这段代码的作用:保持对新传入的对象的所有权,同时放弃对旧对象的所有权,可防止自己要调用的东西被提前释放
打印出来的值是-1 因为hello存在常量区里 被设置成最大值 不会被release
法则
誰创建内存誰就要释放内存
管理机制
引用计数器
1使用alloc(相当于C语言中的malloc)为对象分配内存,使用dealloc(相当与C语言中的free)释放对象所占有的内存
2使用alloc new或者copy构造对象时,对象的retainCount为1
3调用对象retain方法可以增加1 reatainCount
4调用对象的release方法可以减少1 reatainCount
代码如下
.h文件
#import
@interface Student : NSObject
@property(assign,nonatomic)int age;
@property(retain,nonatomic)NSString *name;//因为在属性添加了retain相当于为name的计数器+1所以得用dealloc来释放
@end
.m文件
#import "Student.h"
@implementation Student
@synthesize name,age;
-(void)dealloc{//防止指针泄漏
self.name=nil;
[super dealloc];
}
@end
main函数
#import
#import "Student.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *stu=[[Student alloc]init];
NSLog(@"%ld",[stu retainCount]);
[stu retain];
NSLog(@"%ld",[stu retainCount]);
[stu release];
NSLog(@"%ld",[stu retainCount]);
[stu autorelease];
NSLog(@"%ld",[stu retainCount]);//会在结束时才会-1
}
return 0;
}
5当对象的retainCount为0时,dealloc会自动调用,释放对象内存,否则分配给对象的内存将被一直占用
NSString *str=@"hello";
内存释放原则
1 对象又创建,就会又摧毁,而且使用后,应立即relesse
2.凡是出现alloc copy retain的地方,都会有一个release或autorelease对应
3用便利构造器创建的对象不能用release,该对象由autorelease管理内存;
4一定不要释放没有所有权的对象
几个关键字可能影响到内存管理(影响内存或者内存记数)
retain 不影响 影响
release 不影响 影响
alloc 影响 影响
doalloc 释放 影响(将实例变量清零)
autorelease 不影响 (自动释放池结束时,进行-1动作)
assign 不影响 不影响
设置器的重现
当你写在.h文件写了@property(retain,nonatomic)Student *stu;
在.文件中写了 @synthesize stu;
系统将自动生成
if(stu!=stu){
[stu release]
stu=[newstu retain]
}
自动生成这段代码的作用:保持对新传入的对象的所有权,同时放弃对旧对象的所有权,可防止自己要调用的东西被提前释放
NSString *str=@"hello";
NSLog(@"%ld",[str retainCount]);
打印出来的值是-1 因为hello存在常量区里 被设置成最大值 不会被release