Управление памятью iOS и инициализация NSString - PullRequest
0 голосов
/ 27 сентября 2011

Все еще изучаю разработку под iOS с ObjectiveC и iOS и пытаюсь понять управление памятью! Цените любые советы по фрагменту ниже, например: 1) Анализатор говорит, что есть потенциальные утечки памяти, но не может их устранить? 2) Должен ли я хранить alloc и инициализировать строки NSStrings в цикле for и при добавлении к?

Спасибо

- (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];
}

Ответы [ 3 ]

3 голосов
/ 27 сентября 2011

Вам не нужны звонки на номера alloc, release или autorelease.Вместо этого используйте [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;
}
0 голосов
/ 27 сентября 2011

Используйте ARC (автоматический подсчет ссылок) для новых проектов.Для более старых проектов может быть легко преобразовать их, если нет, ARC может быть отключен для каждого файла при необходимости.

Использование изменяемой строки, автоматически выпущенных методов удобства и небольшого повторного рефакторинга:

- (NSString *) lookUpCharNameForID: (NSString *) inCharID
{
    NSMutableString *tempName = [NSMutableArray array];

    if (inCharID.length)
    {
        NSArray *idList = [inCharID componentsSeparatedByString: @","];
        for (NSString *nextID in idList)
        {
            if (tempName.length == 0)
                [tempName appendFormat: @"%@C", nextID];
            else
                [tempName appendFormat: @"+%@C", nextID];
        }
    }

    return tempName;
}
0 голосов
/ 27 сентября 2011

У вас есть 2 alloc initWithFormat для tempName.Один до цикла и один внутри цикла.

...