1
// targ_url is passed in as an address to a NSString pointer.

- (long) analyse_scan_result : (NSString *)scan_result  target_url : (NSString **)targ_url

{

    NSLog (@" RES analyse string : %@", scan_result);

    NSRange range = [scan_result rangeOfString : @"http://"
                                 options       : NSCaseInsensitiveSearch
                     ];

    // **** The following retain is the first retain 
    // **** statement in this method.

    if (range.location == NSNotFound)
    {
        *targ_url = @"";
       [*targ_url retain];
        NSLog(@" FND string not found");
        return 0;
    }

    NSString *sub_string = [scan_result substringFromIndex : range.location];

    range = [sub_string rangeOfString : @" "];

    if (range.location != NSNotFound) {
        sub_string = [sub_string substringToIndex : range.location];         
    }

    NSLog(@"FND sub_string = %@", sub_string);

    *targ_url = sub_string;

    // ** The following retain is the second retain
    // ** statement in this method.

    [*targ_url retain];

    return [*targ_url length];

}

この質問は、私が以前に尋ねた質問に似ており、関連しています(十分に解決されているようです)。繰り返しますが、上記の方法は、保持ステートメントが追加された後にのみ機能します。上記で 2 つ追加されていますが、一度に実行されるのは 1 つだけです。

このルーチンが行うことは、バーコード スキャナーの出力から "http://" 文字列を見つけて返すことです。私の質問は、retain ステートメントが必要または適切かどうかです。

どなたか詳しい方教えていただければ幸いです...

4

1 に答える 1

2

TL;DR

参照によって所有されたオブジェクトの値を返さないでください。

説明:

慣例により、参照によって (または値によっても) 返されるオブジェクトは、メソッドで特に指定されていない限り、所有されません。メソッド名に含まれる場合、copyまたはnew所有された参照を提供することが期待される場合、それ以外の場合、参照カウントは無関係であると見なされます。

たとえば、参照によって を返す Cocoa メソッドは、リリースする予定NSErrorのない autoreleasedを返します。NSError

これが意味することは、メソッド名で何をしているのかを示す限り、どちらでも実行できるということです。おそらく、自動解放された参照を返し、それを保持し続けるかどうかを呼び出し元に決定させたいだけでしょう。

このドキュメントによると、どうやら Apple は、参照によって所有された値を返すべきではないと考えているようです。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html

于 2012-10-31T23:32:51.607 に答える