retain、strong、copyテスト

2883 ワード

時々retain、strong、copyの違いに戸惑うことがありますが、記録したほうがいいです.まずコードを見てみましょう.
クラスの作成、属性の定義
#import <Foundation/Foundation.h>

@interface Person : NSObject

@property (nonatomic, retain) NSString *strRetain;
@property (nonatomic, strong) NSString *strStrong;
@property (nonatomic, copy) NSString *strCopy;
@property (nonatomic, retain) NSMutableString *strMutableRetain;
@property (nonatomic, strong) NSMutableString *strMutableStrong;
@property (nonatomic, copy) NSMutableString *strMutableCopy;

@end

mainメソッドのコード:
Person *per = [[Person alloc] init];
    NSString *name = @" XM";
    [per setStrRetain:name];
    [per setStrStrong:name];
    per.strCopy = name;
    
    NSMutableString *name2 = [[NSMutableString alloc] initWithString:@" XM2"];
    per.strMutableRetain = name2;
    per.strMutableStrong = name2;
    per.strMutableCopy = name2;
    
    NSLog(@"------   ------");
    NSLog(@"per.strRetain: %@, ", per.strRetain);
    NSLog(@"per.strStrong: %@", per.strStrong);
    NSLog(@"per.strCopy: %@", per.strCopy);
    NSLog(@"per.strMutableRetain: %@", per.strMutableRetain);
    NSLog(@"per.strMutableStrong: %@", per.strMutableStrong);
    NSLog(@"per.strMutableCopy: %@", per.strMutableCopy);
    
    name = @" XM";
    [name2 appendString:@" XM2"];
    
    NSLog(@"-------   -------");
    NSLog(@"per.strRetain: %@", per.strRetain);
    NSLog(@"per.strStrong: %@", per.strStrong);
    NSLog(@"per.strCopy: %@", per.strCopy);
    NSLog(@"per.strMutableRetain: %@", per.strMutableRetain);
    NSLog(@"per.strMutableStrong: %@", per.strMutableStrong);
    NSLog(@"per.strMutableCopy: %@", per.strMutableCopy);

印刷結果:
 ------   ------
per.strRetain:  XM, 
per.strStrong:  XM
per.strCopy:  XM
per.strMutableRetain:  XM2
per.strMutableStrong:  XM2
per.strMutableCopy:  XM2
-------   -------
per.strRetain:  XM
per.strStrong:  XM
per.strCopy:  XM
per.strMutableRetain:  XM2 XM2
per.strMutableStrong:  XM2 XM2
per.strMutableCopy:  XM2

結論:
1、可変オブジェクトにとって、retain、strong、copyの3つの役割は同じである.すなわち、参照の元のオブジェクト値が変更された後、他の参照オブジェクトの属性値が影響を受けないか、元の値を維持するか.
2、可変オブジェクトでは、retain、strong、copyの役割に違いがあります.retain、strong修飾のプロパティを使用すると、参照の元のオブジェクトの値が変更されると、他の参照のオブジェクトのプロパティの値が一緒に変化しますが、copy修飾のプロパティの値は元のままです.copyの役割は主にここに現れている:属性値が元の参照オブジェクトの値に従って変化しないようにする;
3、retainとstrongの違い:役割は同じで、書き方の違いだけです.非arcメカニズムの場合、retainキーワードで修飾されます.arcメカニズムの後、retainの代わりにstrongキーワードを使うのが一般的です