博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C内存管理教程和原理剖析(三)
阅读量:4518 次
发布时间:2019-06-08

本文共 892 字,大约阅读时间需要 2 分钟。

初学Objective-C的朋友都有一个困惑,总觉得对Objective-C的内存管理机制琢磨不透,程 序经常内存泄漏或莫名其妙的崩溃。我在这里总结了自己对Objective-C内存管理机制的研究成果和经验,写了这么一个由浅入深的教程。希望对大家有 所帮助,也欢迎大家一起探讨。

@property (retain)和@synthesize的默认实现

在这里解释一下@property (retain) ClassB* objB;和@synthesize objB;背后到底发生了什么(retain property的默认实现)。property实际上是getter和setter,针对有retain参数的property,背后的实现如下(请参考附件中的memman-getter-setter.m,你会发现,结果和memman-property.m一样):

  1. @interface ClassA : NSObject 
  2.          ClassB *objB; 
  3. -(ClassB *) getObjB; 
  4. -(void) setObjB:(ClassB *) value; 
  5. @end 
  6.  
  7. @implementation ClassA 
  8. -(ClassB*) getObjB 
  9.          return objB; 
  10. -(void) setObjB:(ClassB*) value 
  11.          if (objB != value) 
  12.          { 
  13.                    [objB release]; 
  14.                    objB = [value retain]; 
  15.          } 

在setObjB中,如果新设定的值和原值不同的话,必须要把原值对象release一次,这样才能保证retain count是正确的。

由于我们在class内部retain了一次(虽然是默认实现的),所以我们要在dealloc方法中release这个成员变量。

  1. -(void) dealloc 
  2.          [objB release]; 
  3.          [super dealloc]; 

示例代码文件链接:

转载于:https://www.cnblogs.com/Free-Thinker/p/4991639.html

你可能感兴趣的文章
第一个只出现一次的字符
查看>>
多个视图控制器的返回
查看>>
Codeforces Round #451 Div. 2 C D E
查看>>
快速构建编辑类型弹出窗口
查看>>
室外光缆结构
查看>>
【JZOJ3400】旅行
查看>>
第5.2次作业
查看>>
luoguP5108 仰望半月的夜空 [官方?]题解 后缀数组 / 后缀树 / 后缀自动机 + 线段树 / st表 + 二分...
查看>>
Mysql学习第一天
查看>>
031 oracle环境下的Start with...Connect By递归树查询
查看>>
深入浅出 Java Concurrency (17): 并发容器 part 2 ConcurrentMap (2)[转]
查看>>
【 HYSBZ - 2440 】完全平方数 (莫比乌斯函数容斥)
查看>>
最优矩阵链乘
查看>>
2012年软件大赛校内选拔赛
查看>>
2017 Java面试大全(一)
查看>>
PHP实现四种基本排序算法
查看>>
Poj3414广搜
查看>>
云南南天电子信息产业股份有限公司某站SQL注入漏洞
查看>>
09-C#笔记-循环
查看>>
3.20下午
查看>>