strong,weak,assign,copy

前言:
iOS中数据是存在堆和栈中的,然而我们的内存管理管理的堆上的内存,栈上的内存并不是我们管理

非OC对象(基础数据类型)存储在栈上,栈是由系统自动分配并释放
OC对象存储在堆上

一、各个修饰符解析

strong:表示指向并拥有该对象,其修饰的对象引用计数会增加1。该对象只要引用计数不为0则不会被销毁。

weak:表示指向但不拥有该对象。其修饰的对象本身引用计数不会增加。无需手动设置,该对象会自行内存中销毁。

assign:主要用于修饰基本数据类型,如NSInteger和CGFloat,这些数值存在于栈上。有系统自动管理内存

copy:
    1、源对象是不可变对象,不论是copy还是strong,都是浅拷贝,不开辟新的内存,。此时使用copy和strong,并没有对数据产生影响。
    2、源为可变对象时,使用copy声明属性,会深拷贝,开辟一块新的内存空间存放值,源数据不论发生怎么变化,都不会影响copy属性中的值,属于深拷贝。
也就是说:copy出来的字符串一定是不可变字符串,如果传入的是可变字符串,会发生深拷贝为不可变字符串,否则为浅拷贝。

二、使用

1、可变用strong的原因

    NSMutableString *str = [NSMutableString stringWithString:@"3"];
    self.MutableStrCopy  = str;/

上面的代码中self.MutableStrCopy时用copy修饰的全局变量,使用可变str个MutableStrCopy赋值之后可以看到我们的MutableStrCopy类型变成了NSString不可变字符串。此时如果再调用可变字符串的方法例如appendString就会报unrecognized selector而crash。

2、不可变用copy的原因

self.string是一个strong修饰的不可变字符串,将可变字符串str赋值给string后,再去改变可变字符串str的值,self.string的值也一样会被修改。数据将会不安全

NSMutableString *str = [NSMutableString stringWithString:@"3"];
self.string = str;
[str appendString:@"san"];

你可能感兴趣的:(strong,weak,assign,copy)