2016-06-23 2 views
0

Objective-CのMannul参照カウントに関するいくつかのテストがあります。NSString参照カウントに関する多くの問題

- (void) test { 
    NSData *a1 = [[NSData alloc] init]; 
    NSLog(@"NSData: %lu", [a1 retainCount]); 

    NSMutableData *a2 = [[NSMutableData alloc] init]; 
    NSLog(@"NSMutableData: %lu", [a2 retainCount]); 

    NSObject *a3 = [[NSObject alloc] init]; 
    NSLog(@"NSObject: %lu", [a3 retainCount]); 

    NSString *b1 = [[NSString alloc] initWithFormat: @"%@", @"ok"]; 
    NSLog(@"NSString: %lu", [b1 retainCount]); 


    NSString *b2 = [[NSString alloc] initWithFormat: @"%@", a3]; 
    NSLog(@"NSStinrg: %lu", [b2 retainCount]); 


    NSString *a = @"abc"; 
    NSString *b = @"abc"; 
    NSLog(@"%p", a); 
    NSLog(@"%p", b); 

} 

コンソール:

2016-06-23 16:15:50.490 text[38147:3406036] NSData: 18446744073709551615 
2016-06-23 16:15:50.491 text[38147:3406036] NSMutableData: 1 
2016-06-23 16:15:50.491 text[38147:3406036] NSObject: 1 
2016-06-23 16:15:50.491 text[38147:3406036] NSString: 18446744073709551615 
2016-06-23 16:15:50.491 text[38147:3406036] NSStinrg: 1 
2016-06-23 16:15:50.491 text[38147:3406036] 0x10359d160 
2016-06-23 16:15:50.491 text[38147:3406036] 0x10359d160 

そして私はNSDataNSStringの参照カウントが(-1)UINT_MAXをしている理由を知ってほしい、とinitWithFormatb2が追加になります 私は、これらのコードの下で実行しますカウント? abのアドレスが同じ理由は何ですか?

Thxたくさん。

+2

[-retainCountを使用するタイミングは?](http://sdarlington.github.io) – vikingosegundo

+0

@vikingosegundo haha​​、あなたは私の前にいます。 – Fogmeister

答えて

2

空の不変のNSDatasは、1つのインスタンスに対して一意であり、保持または解放できません(UINT_MAX-1 refcountで示されます)。 NSStringの場合、%@はオブジェクトの-descriptionを呼び出した結果に置き換えられ、NSStringの-descriptionメソッドはselfを返します。したがって、そこには定数NSStringリテラルがありますが、これは保持または解放できるものではありません。定数文字列もユニークなので、コンパイル時にバイナリに1つ埋め込まれており、割り当ては行われません。

+0

無関係な質問を迷惑にしないでください。 –

+0

したがって、 'a'と' b'はバイナリのコンパイル時に埋め込まれています。そして、このときコンパイラは 'a'と' b'を比較して、それらが等しいかどうかを判断することができます。この方法で、彼らは1つのアドレスを共有しますか? –

+0

@Desgard_Duan:Objective-Cはメモリを節約するためにたくさんのことを行います。ポインタがオブジェクト自体であるオブジェクトを持つことを含む。 – gnasher729

2

apple docs

- (NSUInteger)retainCount 

から、この方法は、メモリ管理の問題をデバッグするには無価値です。 にオブジェクトを保持しているオブジェクトがあるため、参照が保持されていますが、同時にオートリリース プールにオブジェクトの任意の数の遅延リリースが保持されている可能性があります。 は取得できませんこのメソッドの有用な情報

関連する問題