Подтвердить что ты не робот

Аргументы по ссылке в Objective-C

Я пытаюсь передать NSString по ссылке, но он не работает.

Это функция:

+(void)fileName:(NSString *) file
{
    file = @"folder_b";
}

и это вызов:

NSString *file;

[function fileName:file];

nslog(@"%@",file);    // and there is nothing in the string....

Что мне нужно сделать, чтобы передать мою строку по ссылке?

4b9b3361

Ответ 1

Я считаю, что вы ищете:

+ (void)fileName:(NSString **)file
{
  *file = @"folder_b";
}

Что действительно сделано здесь, мы работаем с указателем на указатель на объект. Проверьте C (yup, просто C) руководства для "разыменования указателя" для получения дополнительной информации.

(... Но, как неоднократно указывалось, в этом конкретном примере нет оснований для передачи по ссылке вообще: просто верните значение.)

Ответ 2

Если вы хотите вернуть значение, вернуть значение. Передача по ссылке в Cocoa/iOS в основном ограничена NSError**.

Дано:

+(void)fileName:(NSString *) file

Тогда do:

+(NSString *) fileName;

И сделай это.

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

В Objective-C прохождение по ссылке пахнет, как будто вы делаете это неправильно.


Передача по ссылке в Objective-C зарезервирована в основном для возврата NSError* информации о восстановимом сбое, где возвращаемое значение самого метода указывает, была ли выполнена или не выполнена запрошенная задача (вы можете передать NULL как аргумент NSError**, чтобы позволить методу оптимизировать создание метаданных ошибок).

Передача по ссылкам также используется для извлечения внутреннего состояния объектов, где возвращаемое значение эффективно является многозначным. То есть методы из AppKit, как показано ниже. В этих случаях аргументы pass-by-reference обычно либо являются необязательными, либо действуют как вторичные возвращаемые значения.

Они используются довольно скудно по API. Разумеется, используется для передачи по ссылке, но, как сказано выше, это должно быть довольно редко и еще реже в коде приложения. Во многих случаях - и в некоторых случаях ниже - потенциально - лучшим примером было бы создание класса, который может инкапсулировать состояние, а затем возвращать экземпляр указанного класса вместо передачи по ссылке.

NSWorkspace.h:- (BOOL)getInfoForFile:(NSString *)fullPath application:(NSString **)appName type:(NSString **)type;
NSTextView.h:- (void)smartInsertForString:(NSString *)pasteString replacingRange:(NSRange)charRangeToReplace beforeString:(NSString **)beforeString afterString:(NSString **)afterString;
NSAttributedString.h:- (BOOL)readFromURL:(NSURL *)url options:(NSDictionary *)options documentAttributes:(NSDictionary **)dict;
NSNib.h:- (BOOL)instantiateWithOwner:(id)owner topLevelObjects:(NSArray **)topLevelObjects NS_AVAILABLE_MAC(10_8);
NSSpellChecker.h:- (NSRange)checkGrammarOfString:(NSString *)stringToCheck startingAt:(NSInteger)startingOffset language:(NSString *)language wrap:(BOOL)wrapFlag inSpellDocumentWithTag:(NSInteger)tag details:(NSArray **)details NS_AVAILABLE_MAC(10_5);

Ответ 3

Передача указателя на объект - это путь Objective C (и C) для передачи по ссылке.

Я согласен с "bbum", что воспринимаемая необходимость проходить по ссылке - это сигнал думать о том, что вы делаете; однако, это далеко не так, что нет законных оснований для передачи по ссылке.

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

-Просто мои 2 цента

Ответ 4

Попробуйте это

+(void)filename:(NSString **)file {
     *[email protected]"folder_b";
}

и отправьте файл как &file как:

NSString *file;
[function fileName:&file];
nslog(@"%@",file);

надеюсь, что это сработает.

Ответ 5

Я подозреваю, что это потому, что NSString неизменен. Вы пробовали NSMutableString?