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

Я пишу метод в Objective-C, который должен возвращать строку, основанную на вводе NSMutableArray.Я не намерен, чтобы вызывающие абоненты модифицировали строку, но мне было все равно.Текущая подпись метода выглядит следующим образом:

- (NSMutableString *) generateString:(NSMutableArray *)myArray

В настоящее время проект является инструментом Foundation из командной строки для изучения веревок, но в конечном итоге это закончится приложением для iPhone.

Myвопросы:

  1. Было бы разумнее вернуть строку NSString?

2) При возврате NSMutableString я должен использовать autorelease?Если вы рекомендуете, я возвращаю NSString, как это модифицирует, возвращая его?

3) Если я также хочу вернуть объект ошибки, определяющий, если произошла ошибка, возможно, перечисление и строку, как работает владениетот случай?Метод не называется alloc, new или copy, так как бы узнал вызывающий объект?Как бы я возвратил выделенный объект ошибки в дополнение к строке в приведенном выше методе?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 11 января 2011
  1. Я бы вернул NSString в большинстве случаев.Он занимает немного меньше места в памяти, и, если вызывающая сторона нуждается в изменяемой копии, ее создание всего лишь одним способом: mutableCopy.
  2. Вы не только должны, но должны автоматически освободить NSString или NSMutableString ваш метод возвращает (по крайней мере, если вы назвали свой метод, как в примере)! Руководство по программированию управления памятью перечисляет правила, которые необходимо соблюдать, чтобы избежать полного беспорядка, и подробно объясняет все.Так что читайте!
  3. Фреймворк Foundation использует класс NSError для описания ошибок.Чтобы «вернуть» дополнительные параметры, ваш метод должен выглядеть следующим образом:

    - (NSString *)generateString:(NSMutableArray *)myArray error:(NSError **)error
    {
        BOOL failed;
        // Do some fancy stuff, if the operation fails, failed is true
        if (failed == YES) {
            if (error != NULL) {
                *error = [NSError errorWithDomain:@"your_domain" code:123 userInfo:nil];
            }
            return nil;
        }
    
        return [yourString autorelease];
    }
    
    // ...
    
    // Calling your method
    NSError *error = nil;
    [someObject generateString:someArray error:&error];
    

Обратите внимание на два **, и что любой NSError var может быть NULL, а не nil (поэтому вы должны проверить это в теле метода).

1 голос
/ 11 января 2011

По умолчанию методы возвращают autorelease NSString, и я рекомендую использовать то же поведение.Если вам нужно изменить результирующую строку, вы можете использовать временные строки.

...