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是浅复制。 效果都一样。指向同一个地址
    
}

时间: 2024-08-03 23:05:44

strong retain copy对于 nsstring,nsmutablestring的区别的相关文章

QF——关于iOS的强引用,弱引用及strong,retain,copy,weak,assignd的关系

强引用和弱引用: 我们已经知道OC中的内存管理是通过“引用计数器”来实现的.一个对象的生命周期取决于它是否还被其他对象引用(是否retainCount=0).但在有些情况下,我们并不希望对象的销毁时间由是否被其他对象引用来决定,而是这个对象本该是什么时候销毁就什么时候被销毁.这时,我们得引入“强引用”和“弱引用”的概念. 强引用:当前对象被其他对象引用时,会执行retain操作,引用计数器+1.当retainCount=0时,该对象才会被销毁.因为我们要进行对象的内存管理,所以这是默认的引用方式

retain、strong和copy测试

时不时会有点迷惑retain.strong.copy三者之间的区别,还是记录下来好一点,先看代码: 创建一个类,定义属性 #import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, retain) NSString *strRetain; @property (nonatomic, strong) NSString *strStrong; @property (nonatomic, c

NSString NSMutableString copy mutableCopy retain weak strong

NSString 与 NSMutableString NSString是不可变字符串对象,这句话的意思,结合代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str = @"Shaw"; NSString *str1 = @"Root"; // NSString *str1的意思是str1

copy,assign,strong,retain,weak,readonly,nonatomic的区别

copy与retain:1.copy其实是建立了一个相同的对象,而retain不是:2.copy是内容拷贝,retain是指针拷贝:  3.copy是内容的拷贝 ,对于像NSString,的确是这样,但是如果copy的是一个NSArray呢?这时只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制".4.copy的情况:NSString *newPt = [pt copy];此时会在堆上重新开辟一段内存存放@"abc" 比如0X1122 内容为@&q

iOS学习笔记-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

readwrite:是可读可写特性,需要生成getter和setter方法:readonly是之都特性,只会生成getter方法,不会生成setter方法,不希望属性在类外改变时候使用:alloc 对象分配后引用计数为1retain 对象的引用计数+1 copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变assign:是赋值特性,setter方法将传入参数赋值给实例变量(一把钥匙,同进同出):用于基础数据类型:weak:由ARC引入的对象变量的属性,比assign多了一个

对于atomic nonatomic assign retain copy strong weak的简单理解

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作 1)atomic 设置成员变量的@property属性时,atomic是默认值,提供多线程安全 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic后setter函数会变成下面这样: {lock} if (property != newValue) { [property release]; property = [newValue retain]; } {unlock} 2)n

retain strong 和 copy 讨论,有建议的的童鞋请留言

总结下我的理解: strong weak是ARC引入的,strong相当于retain,但是对于有的类型,例如NSString,则使用strong相当于使用copy 这样直接用strong就可以直接处理retain和strong的情况了. weak相当于assign,但是比后者多一点:对象被干掉时会将weak引用设为nil,而对nil发送消息都不会导致崩溃 否则weak引用为野指针,会出现问题 这里说strong 有copy的功能是错误的哦.实验例子 @interface AppDelegate

strong和copy的区别

strong和copy的区别 问题描述 在定义一个类的property时候,为property选择strong还是copy特别注意和研究明白的,如果property是NSString或者NSArray及其子类的时候,最好选择使用copy属性修饰.为什么呢?这是为了防止赋值给它的是可变的数据,如果可变的数据发生了变化,那么该property也会发生变化. 代码示例 还是结合代码来说明这个情况 @interface Person : NSObject @property (strong, nonat

关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】

@property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. NSObject对象的@property属性时,默认为atomic,提供多线程安全. 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic,setter函数会变成下面这样: NSLock *_lock = [[NSLock alloc]ini