• Objective-C内存管理教程和原理剖析(三)


    初学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]; 

    示例代码文件链接:http://files.cnblogs.com/VinceYuan/objective-c-memman.zip

  • 相关阅读:
    20200902
    20200808
    20200801
    20191017
    LeetCode #974. Subarray Sums Divisible by K 数组
    LeetCode #532. K-diff Pairs in an Array 数组 哈希 双指针
    LeetCode #234. Palindrome Linked List 链表 栈 链表逆置
    LeetCode #307. Range Sum Query
    LeetCode #45. Jump Game II 数组 贪心
    LeetCode #55. Jump Game 数组 贪心 线性DP 回溯
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4991639.html
Copyright © 2020-2023  润新知