Objective-C_内存管理(二)

一、属性的内部实现原理

assign的属性内部实现

setter方法:

// setter方法
@property (nonatomic, assign) NSString *name;

- (void)setName:(NSString *)name
{
  _name = name;
}

getter方法:

// getter方法
- (NSString *)name
{
  return _name;
}

观察下面代码会出现什么问题?

NSString *name = [[NSString alloc] initWithFormat:@”张三”];
Person *p = [[Person alloc] init];
[p setName:name];
[name release];
NSLog(@”%@”, [p name]); // 如果对象类型使用assign之后,会出现野指针异常
[p release];

retain的属性内部实现

setter方法:

// setter方法
@property (nonatomic, retain) NSString *name;

- (void)setName:(NSString *)name
{
  if(_name != name) {
    [_name release];
    _name = [name retain];
  }
}

getter方法:

// getter方法
- (NSString *)name
{
  return [[_name retain] autorelease];
}

copy的属性内部实现

setter方法:

// setter⽅法
@property (nonatomic, copy) NSString *name;

- (void)setName:(NSString *)name
{
  if(_name != name) {
    [_name release];
    _name = [name copy];
  }
}

getter方法:

// getter方法
- (NSString *)name
{
  return [[_name retain] autorelease];
}

二、dealloc内释放实例变量

dealloc是NSObject的⼀个实例方法,与alloc对应,用于回收开辟的内存空间。这个⽅法在对象引用计数为0时,由系统自动调用通常我们在dealloc中释放类的实例变量。

dealloc使用

以Person.m为示例,代码如下:

- (void)dealloc
{
  [_name release];  //释放setter⽅法泄露的实例变量
  [super dealloc];
}

注意:

  • 永远不要⼿动调用dealloc。
  • 在dealloc⽅法的最后一⾏,必须写[super dealloc];

三、便利构造器⽅法的实现原理

以Person.m为示例,代码如下:

+ (id)personWithName:(NSString *)name
{
  Person *p = [[Person alloc] initWithName:name];
  return [p autorelease];
}

return [p autorelease];是最完美的解决⽅案,既不会内存泄露,也不会产⽣野指针。


四、collection的内存管理

collection就是NSArray,NSDictionary,NSSet…等容器类,collection会自主管理⾃己内部的元素。

collection内存的⾃主管理,加入collection中的对象会被retain,移除出collection的对象会被release,collection被释放会对内部所有对象release。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值