本文主要是介绍进击的KFC:OC(十)内存管理高级,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
⼀、属性的内部实现原理
assign下的属性内部实现
在Person.m中实现:// 实现set get方法,必须指定要赋值的成员变量@synthesize name = _name;- (void)setName:(NSString *)name
{if (_name != name){ //加判断条件,赋同样的值时,只retain一次[_name release]; //把_name指向的name空间计数-1_name = [name retain];// _name指向新的空间name1,计数+1}
}- (void)dealloc
{[_name release]; // 把_name指向的name1计数从1->0,释放空间[super dealloc];
}- (instancetype)initWithName:(NSString *)name
{self = [super init];if(self){// _name = name; // 这种写法对于对象类型是不安全的,可能会出现内存问题,但对于基本数据类型是安全的self.name = name; // 我们调用上面的set方法,是安全的,}return self;
}在mian函数里:
Person *p =[ [Person alloc]init];
NSString *name = [[NSString alloc] initWithFormat:@“王龙”];
NSString *name1 = [[NSString alloc] initWithFormat:@“龙”];
p.name=name; // 对nil release相当于什么都没做, name的计数 1->2
p.name = name1; // name 的计数2->1,name1 的计数 1->2
[name release]; //name的空间计数为1->0,被释放掉了
[name1 release]; // name1的计数2->1
[p release]; //p的计数1->0,调用dealloc方法:[_name release],_name计数1->0,就把name1释放掉了,然后再调用[super delloc],p释放掉了
2.容器:collection
Person *p1 = [[Person alloc] init];Person *p2 = [[Person alloc] init];Person *p3 = [[Person alloc] init];
// 数组添加元素的时候:
// 如果,把一个元素 添加到容器类的对象中(容器类:数组,字典,集合),那么系统将自动给数组中的元素发送retain消息,从而使数组中的元素的引用计数+1
NSArray *array = [[NSArray alloc]initWithObjects:p1,p2,p3 ,nil]; NSLog(@"%ld%ld",p1.retainCount,array.retainCount); // 2,1
// 数组释放时:
// 如果数组释放时,那么在释放之前,系统会自动给数组中的每一个元素 发送release消息,从而使数组中的元素引用计数-1
3.多态
多态的真谛:父类的指针 指向 子类的对象
多态的特点:
⽗类指针可以指向不同的⼦类对象
允许在多个类中定义同⼀个消息接⼝。
可以屏蔽不同⼦类对象之间的差异,写出通⽤代码。
适应需求的不断变化
总结
assign、retain、copy对应不同的setter实现。为实例变量赋值
时,尽量使⽤setter⽅法,再次赋值时,会把之前值release。
dealloc在对象引⽤计数为0时⾃动调⽤,不要显⽰调⽤。dealloc
实现体内,先要释放实例变量,然后执⾏[super dealloc];
便利构造器的内存管理是借助autorelease实现的。
集合会管理⾃⼰的元素。
这篇关于进击的KFC:OC(十)内存管理高级的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!