2

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

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:迈克麦克马斯特和安迪——那么你们可能是对的。我这里没有代码(它在同事的机器上,他们已经离开了一天),但是为了用值填充数组,我们正在按照使用解码器(?)对象的方式做一些事情。

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

伙计,我已经完全杀死了这个。真心希望大家能关注,谢谢指教。我们将更仔细地研究它。

4

5 回答 5

2

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

看到更多代码会很好。我认为到目前为止您发布的错误数量并不多..

于 2008-09-24T21:40:10.600 回答
2

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

于 2008-09-24T21:54:17.540 回答
2

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

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

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

array = [foo bar];

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

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

于 2008-09-24T22:23:57.750 回答
1

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

于 2008-09-24T20:53:38.013 回答
1

您发布的代码应该可以工作。您必须在解码器功能中做一些有趣的事情。

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

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

+ arrayWithContentsOfFile:

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

所以你可以这样做:

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

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

于 2008-09-29T05:59:44.723 回答