0

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

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

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

Мои вопросы:

  1. было бы более разумным, чтобы вернуть NSString?

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

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

Спасибо!

+0

только примечание, не знаю, имеет ли он отношение к вам, но вы можете получить 'NSString' из' NSArray' следующим образом: 'NSString * myString = [myArray componentsJoinedByString: @" "];' – filipe

+0

Спасибо filipe, я этого не знал. Это гладкая идея, но в этом случае я не буду работать, так как существует необходимая логика, влияющая на то, как создается финальная строка. – BigBrother

ответ

5
  1. В большинстве случаев я бы вернул NSString. Он имеет немного меньшую площадь памяти, и если вызывающему абоненту нужна изменчивая копия, создание одного из них - это всего лишь метод: mutableCopy.
  2. Вы должны не только иметь autorelease NSString или NSMutableString Ваш метод возвращает (по крайней мере, если вы назовете свой метод, как в примере)! В Memory Management Programming Guide перечислены правила, которым вы должны следовать, чтобы избежать полного беспорядка и объяснять все в глубину. Так что прочитайте!
  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 вар может быть NULL и не nil (так что вы должны проверить это в теле метода) ,

+0

Обратите внимание, что это должно быть '* error = [NSError', а не' & error = [NSError'. Кроме того, вы все равно должны возвращать нуль, даже если 'error == NULL' - я обычно использую два вложенных' if's' для обработки такого рода случаев.Тем не менее, Thinkos ударил лучших из нас, я думаю, это то, что произошло здесь! –

+0

Спасибо за подсказку - ошибка правильная, конечно, -, - Исправлены обе проблемы в коде. – mplappert

1

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

+0

Я не знаю, что вы имеете в виду «По умолчанию методы возвращают autorelease NSString». Где я могу увидеть это поведение по умолчанию? – Chuck

+0

Спасибо Nickolay, но я не совсем понимаю, что вы подразумеваете под этим. Как это относится к тому, что я спрашиваю? – BigBrother

+0

mplappert лучше описал эту идею) –

Смежные вопросы