【问题标题】:Pass NSMutableArray object传递 NSMutableArray 对象
【发布时间】:2010-09-12 21:27:27
【问题描述】:

我相信我在指针领域迷路了。我知道了(代码语法可能有点不对劲,我不是在看上面有这段代码的机器……但所有相关的细节都是正确的):

NSMutableArray *tmp = [[NSMutableArray alloc] init];

我把它传递给另一个类的例程

- (BOOL)myRoutine: (NSMutableArray *)inArray
{
    // Adds items to the array -- if I break at the end of this function, the inArray variable has a count of 10
}

但是当代码回到调用例程时,[tmp count] 为 0。

我一定错过了一些非常简单但非常基本的东西,但对于我的生活,我看不到它。谁能指出我做错了什么?

编辑:www.stray-bits.com 问我是否保留了对它的引用,我说“也许......我们试过这个:NSMutableArray *tmp = [[[NSMutableArray alloc] init] retain]; 不是确定这是你的意思,还是我做对了。

EDIT2:Mike McMaster 和 Andy——那么你们可能是对的。我这里没有代码(它在同事的机器上,他们已经离开了一天),但是为了用值填充数组,我们正在按照使用解码器(?)对象的方式做一些事情。

此函数的目的是从 iPhone 打开一个文件,将该文件读入一个数组(它是我们在之前的程序运行中保存的一个对象数组)。那个“解码器”有一种方法可以将数据放入数组中。

伙计,我已经彻底毁掉了这个。真心希望大家能关注,谢谢指教。我们会更仔细地研究它。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    NSMutableArray 保留添加到其中的对象,但您是否保留了数组本身?

    【讨论】:

    • 这是一个很好的问题。我们确实尝试过 NSMutableArray *tmp = [[[NSMutableArray alloc] init] retain];但这似乎并没有什么不同。是这个意思吗?
    • 正如其他人所说,保留不是必需的,因为新创建的数组默认保留计数为 1。
    【解决方案2】:

    在这种情况下,您不需要调用 retain。 [[NSMutableArray alloc] init] 创建保留计数为 1 的对象,因此在您专门释放它之前它不会被释放。

    如果能看到更多代码就好了。我不认为你到目前为止发布的错误数量很少..

    【讨论】:

      【解决方案3】:

      我同意 Mike 的观点 - 根据您发布的代码,它看起来是正确的。除了发布用于调用函数并将项目添加到数组中的代码之外,您还可以尝试检查函数末尾的指针的内存地址(当它具有所有对象时),以及一旦它返回(当它没有对象时)。我不确定为什么它会有所不同,但是这些项目也应该保留在数组中。

      【讨论】:

        【解决方案4】:

        您需要向我们展示更多有关如何将对象添加到数组中的信息,以便我们真正提供帮助。

        我见过很多人写这样的代码:

        NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:0];
        
        array = [foo bar];
        

        这样做的人认为它“创建然后设置”一个可变数组,但这根本不是它的作用。相反,它会创建一个可变数组,将其分配给名为 array 的变量,然后将一个不同可变数组分配给该变量。

        因此,请确保您不会混淆它所引用的对象的变量。对象不是变量,它与通过变量交互。

        【讨论】:

          【解决方案5】:

          您发布的代码应该可以工作。你一定在解码器函数中做了一些有趣的事情。

          您不应保留该数组。它会自动保留在 init 中。如果你保留它,你会泄漏内存。如果您只是从目标 c 开始,请花时间阅读“Cocoa 内存管理编程指南简介”。它会让您省去很多麻烦。

          为什么要编写这么多代码来从文件中读取数组?它已经被框架支持:

          + arrayWithContentsOfFile:

          返回从指定文件的内容初始化的数组。 指定的文件可以是完整的或 相对路径名;它的文件 名称必须包含一个字符串 数组的表示,例如 由 writeToFile:atomically: 方法。

          所以你可以这样做:

          NSMuatableArray *myArray = [NSMutableArray arrayWithContentsOfFile:@"path/to/my/file"];
          

          这是一个方便的方法,所以对象会自动释放。如果您想保留它,请务必保留它。

          【讨论】:

          • 调查这个。另一位程序员说我们可能无法使用 arrayWithContentsOfFile: 因为我们没有将数组作为字符串存储在该文件中……不确定我们如何存储它,但我今天会检查一下。感谢您的建议。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多