码迷,mamicode.com
首页 > 其他好文 > 详细

Objective-C学习笔记_内存管理(二)

时间:2015-08-04 13:30:50      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:objective-c   ios   内存管理   

一、属性的内部实现原理

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。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Objective-C学习笔记_内存管理(二)

标签:objective-c   ios   内存管理   

原文地址:http://blog.csdn.net/u013485543/article/details/47275241

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!