向NSMutableArray添加字符串对象?

5

我正在尝试使用一个基础的工具测试(Objective-C),有几个问题需要解决...

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int planetLoop;
    NSString *tempString;
    NSMutableArray *planetArray = [[NSMutableArray alloc] init];

    NSLog(@"STRING ARRAY ... Start");
    for(planetLoop=0; planetLoop<10; planetLoop++) {
        tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1];
        NSLog(@"Planet_%03d", planetLoop+1);
        [planetArray addObject:tempString];
    }

    [planetArray release];
    [pool drain];
    return 0;
}

首先,通常我会在将对象添加到数组后释放它,但是我现在所做的是否正确,因为“tempString”是一个字符串字面量,因此不需要分配或释放内存?

其次,在执行之前,如果我运行这个代码,我会得到以下错误:“无法读取未知的加载命令0x80000022”,这是我的代码有问题吗?从谷歌搜索结果看,似乎这可能是xCode 3.1.2的一个bug,有人有任何想法吗?

最后,我做错了什么吗?我的想法是用10个字符串“Planet_001”到“Planet_010”填充一个数组。

编辑:啊,我明白了,那是因为“= [NSString”部分,即

// Autoreleased object
tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1];
// String literal
tempString = @"Planet_"; 

许多感谢,非常感激 -gary-
3个回答

5
tempString不是一个字符串字面量,@"Planet_%03d"才是字符串字面量。 tempString是一个自动释放对象,这意味着当NSAutoreleasePool被释放时它会被释放。基本上,内存已经被管理好了,你不需要做任何事情。
规则是:如果你使用newalloccopyretain创建一个对象,那么你必须release它。否则,内存已经被管理好了,可能是通过自动释放。 另外,你忘记释放pool了。除此之外,看起来很好。

1
他确实释放了池子:[池子排水] - Chris Suter
@Chris 你说得对。我不知道 drain 会执行 release - Tom Dalling

1

出现“无法读取未知的加载命令0x80000022”错误的一个可能原因是我升级到Snow Leopard,但没有同时升级开发人员工具。看起来这个错误可能是由于尝试在10.6环境中使用10.5版本的XCode进行编译引起的。我明天会研究一下。

Xcode 3.2现在可以在Snow Leopard(Mac OS X 10.6)中使用。安装Snow Leopard后,通过从Xcode Tools磁盘映像中单独安装它来升级到Xcode 3.2。您可以在安装之前覆盖先前版本的Xcode,或者在安装之前将它们移开。

附注:当我遇到“无法读取未知的加载命令0x80000022”错误时,我正在运行OSX 10.6.1和xCode 3.1.2

祝好 -gary-


如果您使用的工具与操作系统版本不同步,请先解决这个问题。这是已知的不稳定配置。 - NSResponder

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接