【问题标题】:NSMutable array - assign and retain objectsNSMutable 数组 - 分配和保留对象
【发布时间】:2011-06-30 23:19:52
【问题描述】:

我需要一些关于如何分配、保留对象的信息。

例如 - 如果我们有两个 viewcontrollers 并且需要将数组数据从 viewcontrlr 1 传递到 viewContrl 2,我们如何将对象从视图 1 发送到视图 2 并在视图 1 中释放它并在视图 2 中保留它。

一个简单的 = 运算符只是分配再次指向视图 1 对象的地址。什么是最好的方法,以便我们可以在视图 1 中释放 obj,并在从视图 1 传递时在视图 2 中保留一个新对象。

【问题讨论】:

    标签: iphone memory-management nsmutablearray assign retain


    【解决方案1】:

    在您的视图控制器 2 中创建一个 NSMutableArray 并为其声明一个保留属性。

    @interface VC2 : UIViewController
    {
       NSMutableArray *mutableArrayInVC2
    } 
    @property (nonatomic, retain) NSMutableArray *mutableArrayInVC2
    

    然后在您的视图控制器中,您可以将其传递给:

    viewController2Instance.mutableArrayInVC2 = mutableArrayInVC1
    

    使用以下方式释放它是安全的:

    [mutableArrayInVC1 release];
    

    [编辑以发表您的评论]

    当您为 mutableArrayInVC2 声明一个保留属性并将 mutableArrayInVC1 传递给它时,“在幕后”您正在通过它的 setter 方法访问该变量,如下所示:

    -(void)setMutableArrayInVC2:(NSMutableArray *)arrayValue
    {
        [arrayValue retain]; // This is your mutableArrayInVC1
        [mutableArrayInVC2 release]; // This is nil the first time you access it which is cool - we can send messages to nil in ObjC
        mutableArrayInVC2 = arrayValue; // So basically you end up doing and assignment but only after retaining the object so it is pointing to the same memory address BUT it is now 'owned' by your VC2 instance.
    }
    

    希望这是有道理的! 罗格

    【讨论】:

    • 没错。我补充一下,您还需要将@synthesize mutableArrayInVC2 放入您的 VC2.m 文件中...
    • 一切都好,有点怀疑——所以当我们在 VC1 中创建 Mutable 数组时,我使用 alloc init 方法来创建实例(我确实在 VC1 和 VC2 中进行了综合、非原子、保留所有操作)。所以当我们像你说的那样分配时 (viewController2Instance.mutableArrayInVC2 = mutableArrayInVC1)) 在我们实际将 NSMutable 数组分配给 VC2 之前我们不需要 alloc 和 init 方法吗?
    • 好问题!你没有,我已经编辑了我的答案,试图解释原因 - 看看它是否有意义......
    【解决方案2】:

    此外,您可能需要查看this article,了解有关保留计数机制的一般信息。它与Cocoa Programming for Mac OS X 中的内容非常相似,IMO 是关于 Cocoa 和 Obj-C 的最佳入门书籍之一。我不确定您对 Obj-C/Cocoa 有多少经验,但如果您正在寻找那种介绍,这是一个很好的起点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      相关资源
      最近更新 更多