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 中的一个错误,有人有什么想法吗?

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

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

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

非常感谢,非常感谢 -gary-

4

3 回答 3

5

tempString实际上不是字符串文字。@"Planet_%03d" 一个字符串文字。tempString是一个自动释放的对象,这意味着它会在 NSAutoreleasePool 耗尽时被释放。基本上,内存已经被管理了,你不需要做任何事情。

规则是:如果你new、或一个对象alloc,那么你必须得到它。copyretainrelease否则,内存已经被管理,可能是通过自动释放。

另外,您忘记发布pool. 除此之外,它看起来还不错。

于 2009-09-14T23:19:39.317 回答
1

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

Xcode 3.2 现在在 Snow Leopard (Mac OS X 10.6) 版本中可用。安装 Snow Leopard 后,通过与 Xcode Tools 磁盘映像分开安装来升级到 Xcode 3.2。您可以在 Xcode 的早期版本上安装它,或者在安装之前将它们移到一边。

PS:当我收到“无法读取未知加载命令 0x80000022”错误时,我正在使用 xCode 3.1.2 运行 OSX 10.6.1

干杯-加里-

于 2009-09-14T22:42:32.610 回答
0

该“加载命令”错误是由于可执行格式已从 iPhone OS 3.0 更改为 iPhone OS 3.1。

http://networkpx.blogspot.com/2009/09/about-lcdyldinfoonly-command.html

于 2010-01-06T02:20:15.823 回答