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

Я только что узнал из этого Stack & nbsp; Overflow post , как указывает Мартин-Гейслер, что вы можете сохранять файлы без спецификации в Блокноте Windows, выбрав ANSI как кодирование.

Я предполагаю, что для более продвинутых целей это не сработает, потому что полученный файл, вероятно, не является конечной кодировкой, но на самом деле ANSI; но я протестировал и подтвердил, что это работает, чтобы сохранить очень маленький .php-скрипт без спецификации, используя только «Блокнот».

Я узнал длинный и трудный способ, что «Блокнот Windows» не является истинным редактором, хотя мне бы хотелось указать на других, которые, несмотря на это, вводят в заблуждение, когда вы набираете «редактор» на более новых машинах Windows, по крайней мере, на одном из моих.

В настоящее время я использую Emacs и других редакторов для решения этой проблемы.

20
задан andyvn22 15 July 2016 в 15:06
поделиться

3 ответа

Полагаю, вы ищете:

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

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

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

.
31
ответ дан 29 November 2019 в 22:27
поделиться

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

Given:

+(void)fileName:(NSString *) file

Then do:

+(NSString *) fileName;

And be done with it.

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

В 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);
63
ответ дан 29 November 2019 в 22:27
поделиться

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

-2
ответ дан 29 November 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: