进击的KFC:OC(十)内存管理高级

本文深入探讨了Objective-C中的内存管理机制,包括属性的内部实现原理、容器类对象的内存管理方式以及多态特性。通过具体的代码示例展示了如何正确使用setter方法进行赋值操作,并解释了dealloc方法的调用时机及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

⼀、属性的内部实现原理
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实现的。
集合会管理⾃⼰的元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值