Методы класса Objective-C и копирование возвращаемых значений - PullRequest
3 голосов
/ 05 августа 2011

Мне нужна помощь в понимании фрагмента кода ниже. В частности, я хотел бы знать, почему ключевое слово copy используется, когда methodB вызывает methodA.

+ (NSString*) methodA {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentsDirectory, 
                                                         NSUserDomainMask, YES);
    return [paths objectAtIndex:0];
}

+ (NSString*) methodB:(NSString*)stringToAppend {

    static NSString *s = nil;
    if(!s) s = [[self methodA] copy];

    return [s stringByAppendingString:stringToAppend];
}

Примечание: очевидно, что методы класса могут вызывать другие методы класса, используя self (тогда как методы экземпляра должны вызывать методы класса, подобные этому [ClassName classMethodName];

Ответы [ 2 ]

2 голосов
/ 05 августа 2011

MethodB вызывает copy в случае, если NSString, возвращаемая методом methodA, на самом деле является NSMutableString.

Копия только для безопасности; вы можете чувствовать себя в безопасности, зная, что содержимое этой строки ничего не меняет, пока вы ее используете.

Это обычная техника для работы с объектами, которые могут изменяться, если вы не хотите, чтобы они были.

0 голосов
/ 05 августа 2011

Что такое paths[0]?Предполагая, что вы имели в виду [paths objectAtIndex: 0], вы должны хотя бы автоматически выпустить его.Затем вы все равно можете скопировать его в methodB:.

Строка, которую вы возвращаете в methodB:, уже автоматически выпущена, так что все в порядке.

...