【问题标题】:Objective C - NSString - Memory basicsObjective C - NSString - 内存基础
【发布时间】:2023-03-21 12:14:01
【问题描述】:

我正在尝试返回一个已从 plist 初始化的 NSString。

如果我注释掉我的发布行,则此代码有效。然而,我想从内存中释放这些对象,因为我不再需要它们。

我认为“initWithString”会将目标字符串的内容复制到我的新字符串中,这意味着我可以安全地释放 NSMutableArray。但事实并非如此。为什么不呢?

+ (NSString*) genImage {

NSString *path = [[NSBundle mainBundle] pathForResource:
                  @"Images" ofType:@"plist"];
NSMutableArray *arrayOfImages = [[NSMutableArray alloc] initWithContentsOfFile:path];

NSLog(@"%d", [arrayOfImages count]);

int indexToLoad = 0;

NSString *res = [[NSString alloc] initWithString:[arrayOfImages objectAtIndex:indexToLoad] ];

[arrayOfImages release];
[path release];
return res;

}

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    您不保留-[NSBundle pathForResource:ofType:]path 变量)的返回值,因此无需释放它(这样做很可能会导致崩溃)。但是,您应该自动释放res,因为您确实保留了它。您可以将最后一行更改为

    return [res autorelease];
    

    【讨论】:

    • 正确,因为我没有在 '*path' 上调用 'alloc',所以我不应该释放它。 - 是吗?
    • @andy boot:基本上。您可以假设名称中没有 allocnewcopy 的方法返回一个自动释放的对象,除非文档另有说明(这种情况非常罕见)。
    • 我想你的意思是 retained 对象(不是自动释放的)!
    • @ipmcc: 不,保留对象通常仅由名称中带有单词allocnewcopy 的方法返回,除非文档另有说明。
    • 啊...我明白了...我将“没有”错误地解析为“有”。继续!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2016-09-05
    • 2010-11-13
    • 1970-01-01
    • 2015-06-20
    • 2020-09-15
    相关资源
    最近更新 更多