strong retain copy对于 nsstring,nsmutablestring的区别

#import "ViewController.h"

@interface ViewController ()
@property (retain,nonatomic) NSString *myRetainStr;
@property (copy, nonatomic) NSString *myCopyStr;
@property (strong, nonatomic) NSString *myStrongStr;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //[self testNSMutableStringCopyRetain];
    //[self testNSStringCopyRetain];
    //[self testNSStringStrongRetain];
    [self testNSMutableStringStrongRetain];
    
    //结论
    //retain和strong对于nsstrong和nsmutablestring效果都一样。都是指向一个地址。
    //对于nstring,retain和copy效果也一样。都是指向同一个地址。
    //对于nsmutablestring,retain和copy效果不一样。retain添加一个引用计数。copy实现深复制。
    //所以,nstring和nsmutablestring在一般情况下用copy修饰符都是完全正确的。
    
}

//NSMutableString的retain和copy区别
-(void)testNSMutableStringCopyRetain{
    NSMutableString *mStr = [NSMutableString stringWithFormat:@"abc"];
    self.myRetainStr   = mStr;
    self.myCopyStr     = mStr;
    NSLog(@"mStr:%p,%p",  mStr,&mStr);
    NSLog(@"retainStr:%p,%p", _myRetainStr, &_myRetainStr);
    NSLog(@"copyStr:%p,%p",   _myCopyStr, &_myCopyStr);
    
    //    2015-06-10 14:49:38.757 strong retain copy nsstring区别[6812:359227] mStr:0x7fed98536cd0,0x7fff56a199b8
    //    2015-06-10 14:49:38.758 strong retain copy nsstring区别[6812:359227] retainStr:0x7fed98536cd0,0x7fed98541fd8
    //    2015-06-10 14:49:38.758 strong retain copy nsstring区别[6812:359227] copyStr:0x7fed9853db50,0x7fed98541fe0
    
    //从运行结果看出,对于NSMutableString retain是添加引用计数。 copy是深复制

}

//NSString的retain和copy区别
-(void)testNSStringCopyRetain{
    NSString *mStr = [NSString stringWithFormat:@"abc"];
    self.myRetainStr   = mStr;
    self.myCopyStr     = mStr;
    NSLog(@"mStr:%p,%p",  mStr,&mStr);
    NSLog(@"retainStr:%p,%p", _myRetainStr, &_myRetainStr);
    NSLog(@"copyStr:%p,%p",   _myCopyStr, &_myCopyStr);
    
//    2015-06-10 14:53:19.822 strong retain copy nsstring区别[6847:361075] mStr:0x7fbc00c44c30,0x7fff547b69b8
//    2015-06-10 14:53:19.822 strong retain copy nsstring区别[6847:361075] retainStr:0x7fbc00c44c30,0x7fbc00d12d58
//    2015-06-10 14:53:19.822 strong retain copy nsstring区别[6847:361075] copyStr:0x7fbc00c44c30,0x7fbc00d12d60
    
    //从运行结果看出,对于NSString来看 retain是添加引用计数。 copy是浅复制。他们之间没有区别
    
}


//NSString的retain和Strong区别
-(void)testNSStringStrongRetain{
    NSString *mStr = [NSString stringWithFormat:@"abc"];
    self.myRetainStr   = mStr;
    self.myStrongStr     = mStr;
    NSLog(@"mStr:%p,%p",  mStr,&mStr);
    NSLog(@"retainStr:%p,%p", _myRetainStr, &_myRetainStr);
    NSLog(@"StrongStr:%p,%p",   _myStrongStr, &_myStrongStr);
    
//    2015-06-10 14:57:41.983 strong retain copy nsstring区别[6919:363984] mStr:0x7f894a49db90,0x7fff5aaf69b8
//    2015-06-10 14:57:41.983 strong retain copy nsstring区别[6919:363984] retainStr:0x7f894a49db90,0x7f894a543db8
//    2015-06-10 14:57:41.983 strong retain copy nsstring区别[6919:363984] StrongStr:0x7f894a49db90,0x7f894a543dc8

    
    //从运行结果看出,对于NSString来看 retain是添加引用计数。 strong是浅复制。 效果都一样。指向同一个地址
    
}


//NSMutableString的retain和Strong区别
-(void)testNSMutableStringStrongRetain{
    NSMutableString *mStr = [NSMutableString stringWithFormat:@"abc"];
    self.myRetainStr   = mStr;
    self.myStrongStr     = mStr;
    NSLog(@"mStr:%p,%p",  mStr,&mStr);
    NSLog(@"retainStr:%p,%p", _myRetainStr, &_myRetainStr);
    NSLog(@"StrongStr:%p,%p",   _myStrongStr, &_myStrongStr);
    
//    2015-06-10 15:01:54.719 strong retain copy nsstring区别[6963:366057] mStr:0x7f9033715590,0x7fff58f749b8
//    2015-06-10 15:01:54.720 strong retain copy nsstring区别[6963:366057] retainStr:0x7f9033715590,0x7f9033617e28
//    2015-06-10 15:01:54.720 strong retain copy nsstring区别[6963:366057] StrongStr:0x7f9033715590,0x7f9033617e38
    
    
    //从运行结果看出,对于NSString来看 retain是添加引用计数。 strong是浅复制。 效果都一样。指向同一个地址
    
}

原文地址:https://www.cnblogs.com/NSNULL/p/4566094.html