内存管理的那些事儿之Obj-C

其实谈到内存管理,自己心中也难免会咯噔一下,不过应朋友们的要求自己也不好再加以推脱。为此借着今晚的夜色,重新翻阅了一遍官方文档并结合自己在工程中的应用经验特整理此篇文章供大家参考,如有错误之处还请大家能够指出。好了,闲话少说进入正题。

众所周知Obj-C的内存管理采用的是引用计数机制,截止到目前为止Obj-C在iOS App的开发中主要提供了两种方式进行内存管理。其一MRR(manual retain-release),使用该方法时你需要时刻清醒的了解你所持有的对象的轨迹,实现该方法的基本原理即为引用计数。其二ARC(Automatic Reference Counting),使用该方法时操作系统同样会采用MRR中的引用计数原理,唯一的不同在于编译时会向你的调用栈中插入合理的内存管理函数。在该篇文章中我们主要对MRR进行探讨,如想了解关于ARC的更多使用与总结则请关注本站。

内存管理基本原则

在Obj-C中内存管理的环境由Foundation框架中的根协议NSObject所提供,譬如retain、release、autorelease以及retainCount。其中在根类NSObject中提供了动态内存分配函数alloc、allocWithZone,在每个基于NSObject的类对象被释放时则会自动调用根类NSObject中的dealloc函数,为此所有继承自根类的子类都需要重写该方法,并在释放完成自己的成员变量与属性时调用父类的dealloc函数。现在我们来展示一下内存管理的基本原则:

  • 所有你创建的对象,你对其都拥有所有权。为此,你需要时刻跟踪该对象,并在合理的时候对其释放,并对指向它的所有指针变量置为nil,防止crash。对象的创建可以采用的函数有函数名前缀为alloc、new、copy、mutableCopy。
  • 使用retain轻而易举拥有一个对象所有权。
  • 长时间不使用该对象,则需要释放该对象的所有权。
  • 不要释放自己无权管理的对象。

下面以代码片段的形式加以解说:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#import <Foundation/Foundation.h>
 
@interface Person : NSObject
{
   @ public
     NSString *_sex;
}
 
/**
  * The person's name.
  * why use copy?
  */
@property (nonatomic, copy) NSString *name;
 
@end
 
@implementation
 
- ( void )dealloc
{
   [_sex release], _sex = nil;
   self.name = nil;
   [super dealloc];
}
 
- (id)init
{
   self = [super init];
   if (self)
   {
     //********
   }
   return self;
}
@end
 
int main ( int argc, char **argv)
{
   Person *person = [[Person alloc] init];
   person.name = @ "Lily" ;
   NSString *pName = person.name;
   //***********
   [pName release], pName = nil;
   [person release], person = nil;
 
   person = [Person new ];
   person.name = @ "Lucy" ;
   pName = [person.name copy];
   //***********
   [pName release], pName = nil;
   [person release], person = nil;
   return 1;
}

在以上代码片段的第14行中的属性采用的修饰符为copy,为什么不实用retain或者assign在后续文章中会对其进行更加详述的说明。第22行存在问题,违反原则第四条,因为在该类中并没有对其初始化,为此不可以对其进行release操作。第42至第44行之间,虽然对象pName可以一直使用,但是存在一定的安全隐患。尤其是在函数调用时,很容易造成外部释放而内部在使用的情况出现,为此大家一定要牢记对该对象拥有所有权之后一定要对其轨迹进行了解。第47行至第52行为正确写法。

由于时间的问题,今天暂且就写到这吧,虽然还有很多需要总结与大家分享的,但是由于好久不写文章再加没有好好的梳理下该篇文章所要针对的目标用户,为此有点混乱。还请大家海涵吧!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值