2011-12-31 11 views
2

私はretaincopyの違いを理解していると思いました。しかし、以下のコードに出会ったとき、私は再び混乱しました。保持してコピーしてください

ViewController.h:これらは、コードされている

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController { 
    NSMutableString *a; 
    NSMutableString *b; 
    NSMutableString *c; 
} 

@property (nonatomic, copy) NSMutableString *a; 
@property (nonatomic, copy) NSMutableString *b; 
@property (nonatomic, copy) NSMutableString *c; 

@end 

ViewController.m:

2011-12-31 16:54:50.244 RetainCopy[5783:207] a:1 
2011-12-31 16:54:50.246 RetainCopy[5783:207] a:2 
2011-12-31 16:54:50.246 RetainCopy[5783:207] b:2 
2011-12-31 16:54:50.247 RetainCopy[5783:207] a:3 
2011-12-31 16:54:50.247 RetainCopy[5783:207] b:3 
2011-12-31 16:54:50.248 RetainCopy[5783:207] b:3 

:結果は、なぜ

#import "ViewController.h" 

@implementation ViewController 

@synthesize a, b, c; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.a = [[NSMutableString alloc] initWithFormat:@"%@", @"aaa"]; 
    NSLog(@"a:%d", a.retainCount); 

    self.b = a; 
    NSLog(@"a:%d", a.retainCount); 
    NSLog(@"b:%d", b.retainCount); 

    self.c = b; 
    NSLog(@"a:%d", a.retainCount); 
    NSLog(@"b:%d", b.retainCount); 
    NSLog(@"b:%d", c.retainCount); 
} 

@end 

は、誰もが説明することができますか?ありがとう。

答えて

4

まず、-retainCountuseless to youです。

第2に、誤解の1つはコピープロパティ実装の実装です。あなたは期待どおりにここにコピーを取得していません。代わりに[arg mutableCopy]ではなく[arg copy]の結果が得られます。そう(簡体字)のような自体は不変タイプの「コピー」の多く:

- (id)copyWithZone:(NSZone*)zone 
{ 
    return [self retain]; 
} 

ので、結果は最終的に次のようになります。

NSMutableString * a = [[NSMutableString alloc] initWithString:@"aaa"]; 
NSString * b = [a copy]; // << returns an immutable copy! 
NSString * c = [b copy]; // << immutable to immutable probably just retains itself! 

彼らは不変と純粋なので、これは意味的に健全です。また、の場合は、型が不変コピーと可変コピーの区別がある場合は、変更可能な型のコピーアクセサーを実装する必要があります。それ以外の場合は、不変のインスタンスを保持しているためにivarを変更しようとすると、プログラムが爆発する可能性があります。これを最後に追加すると、[self.c appendString:@"uh-oh"];

More detail on implementing a mutable property hereが表示されます。

+2

強調するために、** retainCountはまったく役に立たない**。それを呼び出さないでください。 (いい答えだ)。 – bbum

+0

@bbum +1感謝と幸せな新年:) – justin

+0

興味深い点: 'self.a = [[NSMutableString alloc] initWithFormat:@"%@ "、@" aaa "];'は 'に'を設定します不変のコピープロパティの 'NSMutableString'宣言は無視され、うまくいけばコンパイラによってフラグが立てられます(しかしそうではありません)。 – zaph

関連する問題