iOS 内存管理和 NSString 初始化

标签 ios memory-leaks nsstring

仍在使用 ObjectiveC 和 iOS 学习 iOS 开发,并试图真正了解内存管理!感谢对以下代码段的任何建议,例如: 1) Analyzer说有潜在的内存泄漏,但无法解决? 2) 我应该在 for 循环中保留 alloc 并初始化 NSStrings 吗?

谢谢

- (NSString *) lookUpCharNameForID: (NSString *) inCharID
{
    debugPrint ("TRACE", [[@"Lookup Char Name for = " stringByAppendingString: inCharID] UTF8String]);


    NSString *tempName = [[NSString alloc] initWithFormat: @""];
    if (![inCharID isEqualToString: @""])
    {
        // Potentially lookup multiple values
        //
        NSString *newName   = [[NSString alloc] initWithFormat: @""];
        NSArray *idList     = [inCharID componentsSeparatedByString: @","];
        for (NSString *nextID in idList)
        {
            NSLog( @"Lookup %i : %@", [idList count], nextID);
            newName = [[NSString alloc] initWithFormat: @"C%@", nextID];

            // Append strings
            if ([tempName isEqualToString: @""])
                tempName = [[NSString alloc] initWithFormat: @"%@", newName];
            else
                tempName = [[NSString alloc] initWithFormat: @"%@+%@", tempName, newName];
        }
        [newName release];
    }

    return [tempName autorelease];
}

最佳答案

您不需要对 allocreleaseautorelease 的任何调用。相反,使用 [NSString stringWithFormat:] 来创建您不拥有的 NSString 实例,因此不需要管理。此外,考虑使用 NSMutableString 来稍微简化您的代码,例如按照以下(未经测试的)版本:

- (NSString *) lookUpCharNameForID: (NSString *) inCharID
{
    NSMutableString *tempName = nil;

    if (![inCharID isEqualToString: @""])
    {
        NSArray *idList = [inCharID componentsSeparatedByString: @","];

        for (NSString *nextID in idList)
        {
            [tempName appendString:@"+"]; // Does nothing if tempName is nil.

            if (tempName == nil)
                tempName = [NSMutableString string];

            [tempName appendFormat:@"C%@", nextID];
        }
    }

    return tempName;
}

关于iOS 内存管理和 NSString 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7573926/

相关文章:

ios - 将 InputStream 数据转换为不同的数据类型

ios - 应用程序图标在 iPad 中不可见

java - 由于 org.jboss.vfs.spi.JavaZipFileSystem 类的许多实例导致内存泄漏

objective-c - 在自定义 setter 中自动修剪 NSString?

objective-c - 无符号字符数组到十六进制表示 NSString

ios - AWS iOS S3 异常 : Invalid region string

Android:查找内存泄漏的工具?

c - Valgrind 在我的代码中发现了漏洞,有人能帮我找到它吗?

ios - Objective-C 解码引用的可打印文本

ios - 尝试读取已解析的 JSON 数组时索引超出范围