5

ARCがどのように機能するかを確認するために、次のサンプルコードを作成しました

@property (nonatomic, weak) NSString *myString;
@property (nonatomic, weak) NSObject *myObj;
@end

@implementation ViewController
@synthesize myString = _myString;
@synthesize myObj = _myObj;
- (void) viewDidAppear:(BOOL)animated
{
    NSLog(@"Appearing Obj: !%@!",self.myObj);
    NSLog(@"Appearing String: !%@!",self.myString);
}

- (void)viewDidLoad
{
    self.myObj = [[NSObject alloc] init];
    self.myString = [[NSString alloc] init];
    NSLog(@"Loading Obj %@",self.myObj);
    NSLog(@"Loading String: !%@!",self.myString);
}

しかし、驚くべきことに、私はこれらの結果を得ました:

2012-06-19 15:08:22.516 TESTER[4041:f803] Loading Obj (null)
2012-06-19 15:08:22.517 TESTER[4041:f803] Loading String: !!
2012-06-19 15:08:22.533 TESTER[4041:f803] Appearing Obj: !(null)!
2012-06-19 15:08:22.535 TESTER[4041:f803] Appearing String: !!

ご覧のとおり、Objは適切にリリースされましたが、私の文字列(これも弱いプロパティです)はnullを出力しません...なぜですか?

4

2 に答える 2

12

NSStringあらゆる種類の内部トリックを使用してオブジェクトを再利用し、不要な割り当てやコピーを回避します。NSStringインスタンスは不変であるため、これを行うことができます。この場合、によって返される空の文字列を表す共有インスタンスがおそらく存在し[[NSString alloc] init]、この共有インスタンスは別の場所にシングルトンとして保持されます。

于 2012-06-19T20:12:43.237 に答える
6

[[NSString alloc] init]常に同じ値を返します。自分で確認できます。

NSString *string1 = [[NSString alloc] init];
NSString *string2 = [[NSString alloc] init];
NSString *string3 = [[NSString alloc] init];
NSLog(@"string1 = %p, string2 = %p, string3 = %p", string1, string2, string3)

このコードは、3つの同一のアドレスを返します。私の場合、出力は次のとおりです。

string1 = 0x3e8dd74c, string2 = 0x3e8dd74c, string3 = 0x3e8dd74c

つまり、シングルトン[[NSString alloc] init]を返します。シングルトンは通常リリースできません。

他のメソッド(などinitWithFormat:)を使用して文字列を作成すると、通常の「非シングルトン」オブジェクトが作成されます。これは、一部の例外を除いて、通常は解放できます。

さらに: ソースコードを探す(アセンブラー):

-[NSPlaceholderString init]:
00040ea4        f64b009c        movw    r0, 0xb89c
00040ea8        f2c00016        movt    r0, 0x16
00040eac            4478        add     r0, pc
00040eae            4770        bx      lr

これは次のようになります(objectiveCで)

-(id)init
{
    return SOME_CONSTANT_VALUE;
}

かもしれませんがkCFEmptyString、よくわかりません。

于 2012-06-19T21:35:42.377 に答える