在创建对象的时候,回生成retainCount变量,alloc,new,retain都会使这个值+1,对应的release方法则会使这个值-1。当retainCount=0时系统会调用dealloc方法使系统销毁改对象。所以我们在使用手动内存管理时,要注意一下问题:
1.原则:内存管理原则(配对原则)
创建对象时一定要保证alloc,new,retain时,后面对应出现release方法。
如下:
void test{
Person *p =[ [Person alloc] init];
NSLog(@"%d",p.age);
[p release];p=nil;
}
2.避免如下问题
(1)野指针问题:调用一个已经被销毁的对象的方法。如下
void test{
Person *p =[ [Person alloc] init];
[p release];
NSLog(@"%d",p.age);
}
(2)内存泄漏问题:对象已经不在使用,但是内存一直没有释放。如下
void test{
Person *p =[ [Person alloc] init];
p=nil;
[p release];
}
(3)重写dealloc方法,调用[super dealloc]来释放父类中的变量
3. 多个对象的内存的释放问题
@interface Person
{Car *car};
-(void) setCar:(Car *car);
@end
@implementation Person
-(void) setCar:(Car *car){
if(_car!=car){
//release旧职
[_car release];
_car = [car retain];
}
}
-(void) dealloc{
[ _car release];
[super dealloc];
}
@end
@implementation Car
-(void) dealloc{
[ super dealloc];
}
@end
-(void) test{
Person *p =[[ Person alloc]init];
Car *c1 =[ [Car alloc]init];
p.car = c1;
[c1 release];
Car *c2 = [[Car alloc]init];
p.car = c2;
[p release];
}
4.@property主要完成三种操作
(1)生成get,set方法
(2)生成get,set方法的简单实现
(3)如果没有对应的成员变量声明,则会生成以_变量名的成员变量
5.nonatomic和atomic的区别
nonatomic:不生成多线程相关的代码(ios开发都用这个)
atomic:生成多线程相关的代码
6.retain,assign的区别
retain:按内存管理原则生成get,set方法(适用于对象类型,参考上面的set方法)
assign:按照简单的方式生成get,set方法(适用于对象和基本类型)