Arguments by reference in Objective-C

后端 未结 5 739
孤城傲影
孤城傲影 2020-12-09 04:18

I\'m trying to pass an NSString by reference but it doesn\'t work.

This is the function:

+(void)fileName:(NSString *) file
{
    file =          


        
5条回答
  •  攒了一身酷
    2020-12-09 04:41

    If you want to return a value, then return a value. Pass by reference in Cocoa/iOS is largely limited to NSError**.

    Given:

    +(void)fileName:(NSString *) file
    

    Then do:

    +(NSString *) fileName;
    

    And be done with it.

    If you need to return more than one value at a time, that begs for a structure or, more often, a class.

    In Objective-C, pass by reference smells like you are doing it wrong.


    Pass by reference in Objective-C is reserved largely for returning NSError* information about a recoverable failure, where the return value of the method itself indicates whether or not the requested task succeeded or failed (you can pass NULL as the NSError** argument to allow the method to optimize away creating said error metadata).

    Pass by references is also used to retrieve interior state of objects where the return value is effectively a multi-value. I.e. methods from AppKit like the following. In these cases, the pass-by-reference arguments are typically either optional or are acting as secondary return values.

    They are used quite sparingly across the API. There is certainly use for pass by reference, but -- as said above -- doing so should be quite rare and rarer still in application code. In many cases -- and in some of the cases below, potentially -- a better pattern would be to create a class that can encapsulate the state and then return an instance of said class instead of pass by reference.

    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);
    

提交回复
热议问题