lloc new retain之后都必须要调用release方法 计数器要变只有这几种方法 retain release alloc new copy方法才会使计数器改变,谁想用人家对象,就对他进行retain操作,但在dealloc释放本对象的时候也释放引用的对象,先释放引用的对象,然后释放自己,
内存管理做到"谁污染谁治理",谁调用谁retain,是销毁 也要销毁retain的对象
当自己手动写get和set方法的时候,系统就不会帮我们生成synthesize,就不会自动产生下划线对象,所以在手动写get和set方法的时候如果用到下划线字段就会报错
excu_bad_access就是野指针错误,访问了一个不属于你的内存空间
assign:相当于str=str+1,是潜拷贝。对基础数据类型,(NSInteger,CGFloat)和C数据类型(int,float,
double,char,等等)
copy:对NSString
retain:对其他NSObject和其子类
assign:相当于str=str+1,是浅拷贝。对基础数据类型,(NSInteger,CGFloat)和C数据类型(int,float,
double,char,等等)
copy:对NSString
retain:对其他NSObject和其子类
NSMutableString*str1 = [NSMutableStringstringWithString:@"mmmmmm"];
NSString*str2 = [str1copy];//拷贝一份出来,如果不用copy的话,后面对str1进行修改,那么也会影响str2的赋值
[str1appendString:@"asdf"];
[str1release];
NSLog(@"%@",str2);
用点语法,引用计数器就加1
-(id)initWithCoder:(NSCoder *)aDecoder{
if(self = [super init]){
self.name = [aDecoder decodeObjectForKey:@"name"]; //用了.语法,它的引用计数器就会+1
self.email = [aDecoder decodeObjectForKey:@"email"];
}
return self;
}
retain:
-(void)setName:(NSString *)name{
if(_name != book){ //判断传进来的对象是否等于当前对象,如果不等,则释放之前的对象,再retain新对象
[_name release]; //会自动释放当前的对象, 防止原先stu.book = book0;接着stu.book = book1;那么book0就会有内存泄露,没有被释放,这个的话很好的防止了这一点,这也就是retain的作用
_name = [name retain];
}
}
[stu release];
[stu release]; //野指针(会报错) 野指针指指向的内容不属于你的
stu = nil;//指将指针所指向的那条线给擦掉
|