精华内容
下载资源
问答
  • copy和strong

    2016-03-17 15:13:03
    NSString,NSDictionary,NSArray常用copy,是因为使用copy可以保证他们的不可变...@property (strong)NSArray *arr1; @property (copy)NSArray *arr2; NSMutableArray *arr3 = [NSMutableArray arrayWithObject:@1];

    NSString,NSDictionary,NSArray常用copy,是因为使用copy可以保证他们的不可变特性。

    测试:

    @property (strong)NSArray *arr1;
    @property (copy)NSArray *arr2;

        NSMutableArray *arr3 = [NSMutableArray arrayWithObject:@1];
        self.arr1 = [arr3 mutableCopy];
        self.arr2 = [arr3 mutableCopy];
        NSLog(@"%@,%@",_arr1,_arr2);
    

    运行结果如下

    展开全文
  • copy和strong的区别

    2016-08-23 17:45:56
    对于copy和strong的区别主要就是能区分深拷贝还是浅拷贝。 以字符串为例:@property (retain,nonatomic) NSString *secondString; @property (copy, nonatomic) NSString *thirdString;- (void)test { ...

    对于copy和strong的区别主要就是能区分深拷贝还是浅拷贝。
    以字符串为例:

    @property (retain,nonatomic) NSString *secondString;
    @property (copy, nonatomic)   NSString *thirdString;
    
    - (void)test
    {
        NSMutableString *firstString = [NSMutableString stringWithFormat:@"hello"];
        self.secondString   = firstString;
        self.thirdString    = firstString;
        NSLog(@"firstString:%p,%p",  firstString,&firstString);
        NSLog(@"secondString:%p,%p", _secondString, &_secondString);
        NSLog(@"thirdString:%p,%p",   _thirdString, &_thirdString);
    }
    
    结果输出
    2016-08-23 17:16:36.806 Test[2842:464972] firstString:0x7fec7580b7d0,0x7fff5b66ca48
    2016-08-23 17:16:36.806 Test[2842:464972] secondString:0x7fec7580b7d0,0x7fec734d8810
    2016-08-23 17:16:36.806 Test[2842:464972] thirdString:0xa00006f6c6c65685,0x7fec734d8818

    可以从结果看出
    firstString对象的地址为0x7fec7580b7d0,也就是0x7fec7580b7d0是@“hello”的首地址,mStr变量自身在内存中的地址为0x7fff5b66ca48;
    当把firstString赋值给retain的secondString时,secondString对象的地址为0x7fec7580b7d0,rStr变量自身在内存中的地址为0x7fec734d8810;firstString与secondString指向同样的地址,他们指向的是同一个对象@“hello”,这个对象的地址为0x7fec7580b7d0,所以他们的值是一样的。
    当把firstString赋值给copy的thirdString时,thirdString对象的地址为0xa00006f6c6c65685,thirdString变量自身在内存中的地址0x7fec734d8818;thirdString与firstString指向的地址是不一样的,他们指向的是不同的对象,所以copy是深复制,一个新的对象,这个对象的地址为0xa00006f6c6c65685,值为@“hello”。

    增加如下代码:

       [firstString appendString:@"ddd"];
        NSLog(@"secondString:%@",_secondString);
         NSLog(@"thirdString:%@",_thirdString);
    
    
    输出
    2016-08-23 17:29:17.748 ECIphoneTest[3021:472901] secondString:helloddd
    2016-08-23 17:29:17.748 ECIphoneTest[3021:472901] thirdString:hello

    可见浅复制跟随改变,但是深复制没有改变。

    对于将nesting赋值给copy和retain同理。

    得出结论:
    对源头是NSMutableString的字符串,retain仅仅是指针引用,增加了引用计数器,这样源头改变的时候,用这种retain方式声明的变量(无论被赋值的变量是可变的还是不可变的),它也会跟着改变;而copy声明的变量,它不会跟着源头改变,它实际上是深拷贝。

    对源头是NSString的字符串,无论是retain声明的变量还是copy声明的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就是说其实二者都是指针引用,也就是浅拷贝。

    另外说明一下,这两者对内存计数的影响都是一样的,都会增加内存引用计数,都需要在最后的时候做处理。

    简单来说比如声明的一个NSString *secondString变量,然后把一个NSMutableString *firstString变量的赋值给它了,如果要求secondString跟着firstString变化,那么就用retain;如果secondString不能跟着firstString一起变化,那就用copy。而对于要把NSString类型的字符串赋值给secondString,那两都没啥区别。不会影响安全性,内存管理也一样。

    展开全文
  • NSString为不可变字符串,用copy和strong都是只分配一次内存。 1、但是如果用copy,需要先判断字符串是不是不可变字符串,如果是不可变字符串,就不在分配空间,如果是可变字符串才分配空间。 2、如果程序中用到...

    NSString为不可变字符串,用copy和strong都是只分配一次内存。

    1、但是如果用copy,需要先判断字符串是不是不可变字符串,如果是不可变字符串,就不在分配空间,如果是可变字符串才分配空间。

    2、如果程序中用到NSString比较多,每次都先判断会耗费性能,用strong则不会再判断了,所以不可变字符串可以直接用strong修饰。

     

    展开全文
  • NSMutableString 不可变字符串NSString,同时由copy和strong修饰; @interface ViewController () @property (nonatomic, copy)NSString *immutableStrCopy; @property (nonatomic, strong)NSString *...

    原字符串为不可变的情况NSString
    这个情况下分别用cop和strong修饰原字符串,测试字符串分别为可变字符串
    NSMutableString 和不可变字符串NSString,同时由copy和strong修饰;

    @interface ViewController ()
    @property (nonatomic, copy)NSString *immutableStrCopy;
    @property (nonatomic, strong)NSString *immutableStrStrong;
    @property (nonatomic, copy)NSMutableString *variableStrCopy;
    @property (nonatomic, strong)NSMutableString *variableStrStrong;
    
    @property (nonatomic, copy)NSString *immutableTestStrCopy;
    @property (nonatomic, strong)NSString *immutableTestStrStrong;
    @property (nonatomic, copy)NSMutableString *variableTestStrCopy;
    @property (nonatomic, strong)NSMutableString *variableTestStrStrong;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.immutableStrCopy = @"111";
        self.immutableTestStrCopy = self.immutableStrCopy;
        self.immutableTestStrStrong = self.immutableStrCopy;
        self.variableTestStrCopy = self.immutableStrCopy;
        self.variableTestStrStrong = self.immutableStrCopy;
        NSLog(@"\n variableStrStrong = %@ - variableStrStrong的地址:%p\n immutableTestStrCopy = %@ - immutableTestStrCopy的地址:%p\n immutableTestStrStrong = %@ - immutableTestStrStrong的地址:%p\n variableTestStrCopy = %@ - variableTestStrCopy的地址:%p\n variableTestStrStrong = %@ - variableTestStrStrong的地址:%p",self.variableStrStrong,_variableStrStrong,self.immutableTestStrCopy,_immutableTestStrCopy,self.immutableTestStrStrong,_immutableTestStrStrong,self.variableTestStrCopy,_variableTestStrCopy,self.variableTestStrStrong,_variableTestStrStrong);
        
        self.immutableStrCopy = @"222";
        
        NSLog(@"\n variableStrStrong = %@ - variableStrStrong的地址:%p\n immutableTestStrCopy = %@ - immutableTestStrCopy的地址:%p\n immutableTestStrStrong = %@ - immutableTestStrStrong的地址:%p\n variableTestStrCopy = %@ - variableTestStrCopy的地址:%p\n variableTestStrStrong = %@ - variableTestStrStrong的地址:%p",self.variableStrStrong,_variableStrStrong,self.immutableTestStrCopy,_immutableTestStrCopy,self.immutableTestStrStrong,_immutableTestStrStrong,self.variableTestStrCopy,_variableTestStrCopy,self.variableTestStrStrong,_variableTestStrStrong);
    }
    @end
    

    在这里插入图片描述

    被copy修饰的不可变字符NSString发生改变时不会引起测试数据改变,原因是:原数据赋值给测试数据是赋值的是地址,当改变原数据时相当于重新创建了字符对象,并没有改变原来的地址

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.immutableStrStrong = @"111";
        self.immutableTestStrCopy = self.immutableStrStrong;
        self.immutableTestStrStrong = self.immutableStrStrong;
        self.variableTestStrCopy = self.immutableStrStrong;
        self.variableTestStrStrong = self.immutableStrStrong;
        NSLog(@"\n variableStrStrong = %@ - variableStrStrong的地址:%p\n immutableTestStrCopy = %@ - immutableTestStrCopy的地址:%p\n immutableTestStrStrong = %@ - immutableTestStrStrong的地址:%p\n variableTestStrCopy = %@ - variableTestStrCopy的地址:%p\n variableTestStrStrong = %@ - variableTestStrStrong的地址:%p",self.variableStrStrong,_variableStrStrong,self.immutableTestStrCopy,_immutableTestStrCopy,self.immutableTestStrStrong,_immutableTestStrStrong,self.variableTestStrCopy,_variableTestStrCopy,self.variableTestStrStrong,_variableTestStrStrong);
        
        self.immutableStrStrong = @"222";
        
        NSLog(@"\n variableStrStrong = %@ - variableStrStrong的地址:%p\n immutableTestStrCopy = %@ - immutableTestStrCopy的地址:%p\n immutableTestStrStrong = %@ - immutableTestStrStrong的地址:%p\n variableTestStrCopy = %@ - variableTestStrCopy的地址:%p\n variableTestStrStrong = %@ - variableTestStrStrong的地址:%p",self.variableStrStrong,_variableStrStrong,self.immutableTestStrCopy,_immutableTestStrCopy,self.immutableTestStrStrong,_immutableTestStrStrong,self.variableTestStrCopy,_variableTestStrCopy,self.variableTestStrStrong,_variableTestStrStrong);
    }
    

    在这里插入图片描述
    可以看到NSString被copy和strong修饰的运行结果完全一样,都是因为原数据赋值给测试数据赋值的是地址,当改变原数据时相当于重新创建了字符对象,并没有改变原来的地址

    原数据为可变字符NSMutableString

    [self.variableStrCopy appendString:@“222”];
    以追加的方式修改原地址的内容

    self.variableStrCopy = [NSMutableString stringWithString:@“111”];
    给不可变字符赋值相当于重新创建个字符

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.variableStrCopy = [NSMutableString stringWithString:@"111"];
        self.immutableTestStrCopy = self.variableStrCopy;
        self.immutableTestStrStrong = self.variableStrCopy;
        self.variableTestStrCopy = self.variableStrCopy;
        self.variableTestStrStrong = self.variableStrCopy;
        NSLog(@"\n variableStrStrong = %@ - variableStrStrong的地址:%p\n immutableTestStrCopy = %@ - immutableTestStrCopy的地址:%p\n immutableTestStrStrong = %@ - immutableTestStrStrong的地址:%p\n variableTestStrCopy = %@ - variableTestStrCopy的地址:%p\n variableTestStrStrong = %@ - variableTestStrStrong的地址:%p",self.variableStrStrong,_variableStrStrong,self.immutableTestStrCopy,_immutableTestStrCopy,self.immutableTestStrStrong,_immutableTestStrStrong,self.variableTestStrCopy,_variableTestStrCopy,self.variableTestStrStrong,_variableTestStrStrong);
        
         self.variableStrCopy = [NSMutableString stringWithString:@"222"];
        
        NSLog(@"\n variableStrStrong = %@ - variableStrStrong的地址:%p\n immutableTestStrCopy = %@ - immutableTestStrCopy的地址:%p\n immutableTestStrStrong = %@ - immutableTestStrStrong的地址:%p\n variableTestStrCopy = %@ - variableTestStrCopy的地址:%p\n variableTestStrStrong = %@ - variableTestStrStrong的地址:%p",self.variableStrStrong,_variableStrStrong,self.immutableTestStrCopy,_immutableTestStrCopy,self.immutableTestStrStrong,_immutableTestStrStrong,self.variableTestStrCopy,_variableTestStrCopy,self.variableTestStrStrong,_variableTestStrStrong);
    }
    
    

    在这里插入图片描述
    当原数据为可变字符串NSMutableString时 并用copy修饰时 [self.variableStrCopy appendString:@“222”]以追加的方式修改原地址的内容不能用,原因是:可变字符调用copy时会创建个不可变字符,现在的原数据类型相当于不可变字符(NSString)copy只是在set跟get 方法里实现,如果通过懒加载方式加载属性则是可以用的

    只能通过self.variableStrCopy = [NSMutableString stringWithString:@“111”]修改原数据,但是测试数据的值不会发生变化,原因是原数据赋值给测试数据赋值的是地址,当改变原数据时相当于重新创建了字符对象,并没有改变原来的地址的内容

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.variableStrStrong = [NSMutableString stringWithString:@"111"];
        self.immutableTestStrCopy = self.variableStrStrong;
        self.immutableTestStrStrong = self.variableStrStrong;
        self.variableTestStrCopy = self.variableStrStrong;
        self.variableTestStrStrong = self.variableStrStrong;
        NSLog(@"\n variableStrStrong = %@ - variableStrStrong的地址:%p\n immutableTestStrCopy = %@ - immutableTestStrCopy的地址:%p\n immutableTestStrStrong = %@ - immutableTestStrStrong的地址:%p\n variableTestStrCopy = %@ - variableTestStrCopy的地址:%p\n variableTestStrStrong = %@ - variableTestStrStrong的地址:%p",self.variableStrStrong,_variableStrStrong,self.immutableTestStrCopy,_immutableTestStrCopy,self.immutableTestStrStrong,_immutableTestStrStrong,self.variableTestStrCopy,_variableTestStrCopy,self.variableTestStrStrong,_variableTestStrStrong);
        
    //     self.variableStrCopy = [NSMutableString stringWithString:@"222"];
        [self.variableStrStrong appendString:@"222"];
        
        NSLog(@"\n variableStrStrong = %@ - variableStrStrong的地址:%p\n immutableTestStrCopy = %@ - immutableTestStrCopy的地址:%p\n immutableTestStrStrong = %@ - immutableTestStrStrong的地址:%p\n variableTestStrCopy = %@ - variableTestStrCopy的地址:%p\n variableTestStrStrong = %@ - variableTestStrStrong的地址:%p",self.variableStrStrong,_variableStrStrong,self.immutableTestStrCopy,_immutableTestStrCopy,self.immutableTestStrStrong,_immutableTestStrStrong,self.variableTestStrCopy,_variableTestStrCopy,self.variableTestStrStrong,_variableTestStrStrong);
    }
    

    可以看到被copy修饰的测试数据,内容没有发生改变但是地址发生了改变;原因是:可变字符调用copy时会创建个不可变字符
    所以被copy修饰的测试数据是重新创建了个不可变字符对像赋值,而被strong修饰的则是直接赋值的原数据的地址当原地址上的内容发生改变时,测试数据的内容也就改变了;

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.variableStrStrong = [NSMutableString stringWithString:@"111"];
        self.immutableTestStrCopy = self.variableStrStrong;
        self.immutableTestStrStrong = self.variableStrStrong;
        self.variableTestStrCopy = self.variableStrStrong;
        self.variableTestStrStrong = self.variableStrStrong;
        NSLog(@"\n variableStrStrong = %@ - variableStrStrong的地址:%p\n immutableTestStrCopy = %@ - immutableTestStrCopy的地址:%p\n immutableTestStrStrong = %@ - immutableTestStrStrong的地址:%p\n variableTestStrCopy = %@ - variableTestStrCopy的地址:%p\n variableTestStrStrong = %@ - variableTestStrStrong的地址:%p",self.variableStrStrong,_variableStrStrong,self.immutableTestStrCopy,_immutableTestStrCopy,self.immutableTestStrStrong,_immutableTestStrStrong,self.variableTestStrCopy,_variableTestStrCopy,self.variableTestStrStrong,_variableTestStrStrong);
        
         self.variableStrCopy = [NSMutableString stringWithString:@"222"];
    //    [self.variableStrStrong appendString:@"222"];
        
        NSLog(@"\n variableStrStrong = %@ - variableStrStrong的地址:%p\n immutableTestStrCopy = %@ - immutableTestStrCopy的地址:%p\n immutableTestStrStrong = %@ - immutableTestStrStrong的地址:%p\n variableTestStrCopy = %@ - variableTestStrCopy的地址:%p\n variableTestStrStrong = %@ - variableTestStrStrong的地址:%p",self.variableStrStrong,_variableStrStrong,self.immutableTestStrCopy,_immutableTestStrCopy,self.immutableTestStrStrong,_immutableTestStrStrong,self.variableTestStrCopy,_variableTestStrCopy,self.variableTestStrStrong,_variableTestStrStrong);
    }
    

    在这里插入图片描述
    因为可变变字符调用copy时会创建个不可变字符所以被copy修饰的测试数据是重新创建了个不可变字符对像赋值,所以地址发生了改变,而被strong修饰的则是直接赋值的原数据的地址当原地址上的内容没有改变时,测试数据的内容也就不会改变了;

    总结:字符串是否会发生改变在于是否改变了字符串所指向地址的内容是否发生改变,可以使字符串所指向地址的内容是发生改变的只有NSMutableString 所以NSMutableString一定要用copy修饰(如不希望测试数据随原数据改变)否则被strong修饰的字符串会随原数据改变而改变 ,而NSString原则上用copy和strong效果一样,但为了防止被NSMutableString修改还是要用copy

    展开全文
  • 一般类型的copy以及strong有所不同 如果原字符是NSString类型,那么copy和strong的操作效果是一样的,都是对原字符串的引用计数+1,只是一次浅拷贝。 如果原字符串是NSString的子类NSMutableString, 那么strong...
  • 1、只有NS类型调用copy方法才是浅拷贝,其他的情况全是深拷贝 2、容器类调用copy或mutableCopy能出现的深拷贝的情况下,只是容器的深拷贝,而非容器内元素的深拷贝 3、无论是声明NSString还是NSMutableString类型的...
  • NSString属性copy 和strong

    2016-11-19 00:17:45
    定义一个类,并为其声明两个字符串属性 ...如果我们换作MRC环境,打印string的引用计数的话,会看到其引用计数值是3,即strong操作和copy操作都使原字符串对象的引用计数值加了1。 把strin
  • //// @proprety数组字典字符串用copy和strong区别(深浅拷贝).h// IOS笔记/////* _proprety________copy_strong_________h *//*定义属性时NSArray,NSString,NSDictionary为何要用copy定义一个Person类,并定义一下...
  • copy属性用在需要深拷贝的地方,如:block属性。它会造成内存增加,使用...copy声明的对象变量只能对基本对象或block进行深拷贝,若是自定义对象不实现NSCoding协议(序列反序列化)并声明为copy类型就会发生crash!
  • @property (nonatomic,strong)NSString *strongedString; @property (nonatomic,copy)NSString *copyedString;   1、当源不可变字符串改变时  使用srong修饰的属性由于取得的还是源不可变字符串地址、其值会...
  • 后面又衍生出了strong和copy修饰字符串的区别, 搬砖搬了多年,只记得这些修饰词,大概干嘛干嘛用的了。这些时间的面试,也通过这么多年的搬砖,越来越意识到了自己该做点什么了。好了闲聊到这里,以下内容是我根据...
  • 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strongcopy。那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看个例子。 示例 我们定义一个...
  • copy和strong的选择

    2016-04-17 21:25:07
    http://shikezhi.com/html/2015/ios_0710/123380.html
  • 如何区分[obj copy]是深拷贝还是浅拷贝? 1.当不可变类型对象调用copy拷贝后,不会产生新的对象,属于浅拷贝; 2.其他类型对象调用copy,都会产生新的不可变对象,属于深拷贝(遵循NSCopy协议并重写copyWithZone方法)...
  • 1、http://www.cocoachina.com/ios/20150512/11805.html 2、http://blog.csdn.net/winzlee/article/details/51752354 NSStringNSMutableString之间的深拷贝浅拷贝的问题: NSString 使用copy NSMutableStr...
  • strong 修饰有什么区别呢?接下来小编就大家一起来扒一扒。 第一种情况: 使用 copy 修饰 // 代码片段1// Person.h @interface Person : NSObject @property (nonatomic, copy) NSString *lastName; @...
  • The message -[NSString... copy] results in a copy when a mutable string is passed (NSMutableString) or retain when it is immutable (NSString). Therefore, always copy when declaring NSString propertie
  • NSString 是immutable的,是只读不可变的。 NSMutableString是NSString的子类,因此,...NSString在属性中使用copystrong修饰 当该属性不会被NSMutableString对象赋值时,并没有明显区别,因为他是不可变的。 ...
  • http://stackoverflow.com/questions/18526909/whether-i-should-use-propertynonatomic-copy-or-propertynonatomic-strong-fo 'copy' will cause the setter for that property to create a copy of the object....
  • 我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strongcopy。那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看个例子。示例我们定义一个类,并为...
  • 相信大家都使用过strong修饰过string属性,然后对于一般有点经验的人都会是用copy,这是为什么呢?然而自己使用strong修饰好像也没出现啥问题呀,疑惑了
  • copy是为了防止mutable string被无意中修改, NSMutableString是NSString的子类, 因此NSString指针可以持有NSMutableString对象.假如有一个NSMutableString,现在用他给一个retain修饰 NSString赋值,那么只是将...
  • 深拷贝就是把内容拷贝一份产生一份新的对象,新对象计数器为...我们知道在OC中的拷贝函数有copy和mutablecopy,只要你调用了copy不管是NSString, NSDictionary还是NSArray还是NSMutableString还是NSMutableDictionar...
  • 大部分的时候NSString的属性都是copy,那copystrong的情况下到底有什么区别呢? 比如: @property (retain,nonatomic) NSString *rStr; @property (copy, nonatomic) NSString *cStr; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,475
精华内容 20,190
关键字:

copy和strong