内存管理的是—> 堆内存部分
内存—> 堆、栈、全局《包含常量区》、系统自带
内存管理原则:
1.凡是alloc 、retain、copy的地方,都应出现release 或是 autorelease与之对应;
2.属性为retain 或 copy 时,需要在类的dealloc 中释放此属性;
3.便利构造器本身包含autorelease;
4.一定不要释放没有所有权的对象,不要手动调用dealloc;
OC 的两大机制:
1、消息传递机制<方法调用>
2、引用计数;
属性的作用
1.声明实例变量
2.setter和Getter方法 及实现
copy —>针对的是特殊的对象类型
必须遵守了NSCopying协议的对象
alloc 1 创建对象——>拥有对象所有权
init 1 初始化
dosomething 1 执行方法
retain 2 增加 1 ——> 拥有对象所有权
release 1 减去1 ——-> 放弃对象的所有权
dealloc 0 销毁对象
-( id )initWithName:( NSString *)name age:( int )age{
self =[ super init ];
if ( self ) {
self . name = name;
self . age = age;
}
return self ;
}
// 便利构造器
+( id )personWithName:( NSString *)name
age:( int )age{
Person *per = [[ Person alloc ] initWithName :name age :age];
return per;
}
//Person 类的实例对象生命周期结束的标志就是 系统调用dealloc 方法销毁内存
//重写 系统dealloc -->析构函数方法
-(void)dealloc{
// 输出执行方法的方法名和所在行数
NSLog ( @" 打印方法名: %s" , __FUNCTION__ ,__LINE__);
[ _name release ]; // 当前 person 类的对象所拥有的 _name 实例对象需要被释放所有权,以便 _name 对象通过系统自动调用其本身的 dealloc 销毁内存
[ super dealloc ];
}
NSLog ( @"person 的引用计数为: %lu" ,[person retainCount]); // 打印引用计数
[person retain ]; // 应用计数 +1
NSLog ( @"person 的引用计数为: %lu" ,[person retainCount]); // 打印引用计数
[person release ]; // 释放
NSLog ( @"person 的引用计数为: %lu" ,[person retainCount]); // 打印引用计数
[person release ]; // 释放
NSLog ( @"person 的引用计数为: %lu" ,[person retainCount]); // 打印引用计数
Car * mamaCar = [papaCar retain ]; //retainCount+1
Car * sonCar = [mamaCar retain ]; //retainCount+1
Car *friendCar = sonCar; // 直接指向
// 结果都一样
// 由于 papaCar-->alloc int 时 为 1 , mamaCar +1 , sonCar+1 最终操作的都是同一个对象,只是指针不同但指向相同
NSLog ( @"papaCar = %lu " ,[papaCar retainCount ]);
NSLog ( @"mamaCar = %lu " ,[mamaCar retainCount ]);
NSLog ( @"sonCar = %lu " ,[sonCar retainCount ]);
NSLog ( @"friendCar = %lu " ,[friendCar retainCount ]);
[sonCar release ];
NSLog ( @"friendCar = %lu " ,[friendCar retainCount ]);
[mamaCar release ];
NSLog ( @"sonCar = %lu " ,[sonCar retainCount ]);
[papaCar release ];
NSLog ( @"papaCar = %lu " ,[papaCar retainCount ]);
/*
Room 类有一个 Person 类型的属性: person
*/
//@property (nonatomic,assign)Person *person;
@property ( nonatomic , retain ) Person *person;
// _person = person;
//}
// 重写 dealloc 方法
-( void )dealloc{
NSLog ( @" 打印 room 中的 dealloc%s" , __FUNCTION__ ,__LINE__);
[ _person release ]; // 重写了原有方法中没有的内容
[ super dealloc ];
}
Person *newperson = [ Person personWithName : @"lily" age : 23 ]; //1
Room * rooms = [[ Room alloc ] init ]; //1
rooms. person =newperson; //2
[newperson release ]; //1
[rooms release ]; //0--> 调用自身 dealloc 方法销毁自身内存
// 但是由于我们重写了 dealloc 方法,所以在销毁自身内存之前,会对 Person 类型对象通过 _person 指针发送 release 消息,让之前的 retainCount 为 1 的 Person 类型对象 retainCount 减为 0 ,系统会调用 Person 类自己的 dealloc ,来销毁 Person 类型对象所占有的内存空间
NSLog ( @"who is in the room?\n%@" ,rooms. person );