美文网首页专题:XX1iOS收藏ios
NSString 为什么用 copy ? Block 为什么用

NSString 为什么用 copy ? Block 为什么用

作者: Ian_ | 来源:发表于2017-04-10 13:54 被阅读308次

copy

深拷贝与浅拷贝的区别, 在于是否开辟新内存,copy 只针对堆内存对象而言。

浅拷贝:

拷贝的是地址,和对象的 = 赋值是一样的。
OC 中 我们声明一个 NSString 属性。

@property NSString *str;

为什么会有这个 *, c 语言中,*是取值操作符,*str 对应的是值, 所以 str* str 的地址, 为什么要说这个, 就是 = 传递的是对象的地址, 浅拷贝就是地址的拷贝.

提示:上面提到的只针对堆内存的对象。
& 取址操作符,平常声明的值变量是存在栈内存中.

int a = 5;

a 对应的栈中存放的 5,&a 对应栈内存地址。

深拷贝:

开辟新的内存空间,相当于声明了一个新的对象,对象中的值与当前对象值相同。

NSString 为什么用 copy ?

@property (nonatomic, strong) NSString *strongStr;
@property (nonatomic, copy) NSString *cpyStr;

我们有两个对象, 一个用 strong, 一个用 copy.

NSString *tmpStr = @"temp";
self.strongStr = tmpStr;
self.cpyStr = tmpStr;

2017-04-10 12:06:11.953 Copy[66625:4617737] tmpStr:temp
 strongStr:temp
 cpyStr:temp
2017-04-10 12:06:11.953 Copy[66625:4617737] tmpStr:0x10f096078
 strongStr:0x10f096078
 cpyStr:0x10f096078

对于不可变字符串, copy 和 strong 都是浅拷贝.

    NSMutableString *tmpStr = [[NSMutableString alloc] initWithString:@"temp"];
    self.strongStr = tmpStr;
    self.cpyStr = tmpStr;
    [tmpStr appendString:@" + add"];
    NSLog(@"tmpStr:%@\n strongStr:%@\n cpyStr:%@", tmpStr, self.strongStr, self.cpyStr);
    NSLog(@"tmpStr:%p\n strongStr:%p\n cpyStr:%p", tmpStr, self.strongStr, self.cpyStr);

2017-04-10 11:58:56.888 Copy[66562:4610424] 
 tmpStr:temp + add
 strongStr:temp + add
 cpyStr:temp
2017-04-10 11:58:56.888 Copy[66562:4610424] tmpStr:0x600000271580
 strongStr:0x600000271580
 cpyStr:0xa000000706d65744

当 tmpStr 改变之后 strongStr 也改变了, 虽然 strongStr 是个不可变字符串, 但是它指向了一个可变字符串. 可以看见 cpyStr 是深拷贝, 它指向的内存和 tmpStr 完全不同.

NSMutableString 不可以使用 copy.

@property (nonatomic, copy) NSMutableString *mutableString;

copy 返回的都是不可变的, 所以当执行 appendString: 等NSMutableString特有的方法的时候, 会报unrecognized selector sent to instance 这个错误.

tips:

为什么 NSString 可以直接指向一个常量, 而 NSMutableString 不可以?
不可变字符串, 不可变, 他可以指向一个常量, 常量是不可变的, 存放在常量区.

Block 为什么用 copy?

代码块 是存在栈区的, 需要通过 copy 拷贝到堆内存, ARC 下, 赋值的时候编译器会自行对 block 进行 copy 操作, copy 到堆内存, 与一般的对象是相同的.
所以在 ARC 下 block 使用 copy 和 strong 是没有区别的.

相关文章

  • iOS高级面试

    1、修饰属性有哪几个?追问 为什么用copy?weak对象为nil的底层原理?2、block是什么?block有几...

  • NSString 为什么用 copy ? Block 为什么用

    copy 深拷贝与浅拷贝的区别, 在于是否开辟新内存,copy 只针对堆内存对象而言。 浅拷贝: 拷贝的是地址,和...

  • 2019 iOS面试题大全---全方面剖析面试(下)

    1、iOS block 的原理,block 的属性修饰词为什么用 copy,使用 block 时有哪些要注意的? ...

  • 属性copy.strong.weak总结

    1.NSString类型的属性为什么用copy ? NSString类型的属性可以用strong修饰,但会造成一些...

  • NSString为什么用copy

    最近在准备面试!这个问题被问的很多!自己花了一点时间,把demo敲了一遍,顺便看看问题的到底在那。话不多上代码和图...

  • block为什么用copy?

    默认情况下,block是存档在栈中,可能被随时回收,需要copy操作。这也就是我们在定义block的时候用的是co...

  • NSString属性为什么要用copy修饰

    Property-NSString-Copy NSString 属性为什么应该使用copy修饰,使用strong为...

  • 聊聊NSString为什么用copy

    最近和一个朋友一起做外包项目,发现他所有的NSString属性都是用strong来作为关键字的。但其实我们更推荐用...

  • block

    block为什么用copy修饰? 因为在MRC下block默认是存储在栈上的,栈上的内存很可能随时会被释放,blo...

  • Block为什么用copy修饰

    默认情况下,block是存档在栈中,可能被随时回收,通过copy操作可以使其在堆中保留一份, 相当于一直强引用着,...

网友评论

    本文标题:NSString 为什么用 copy ? Block 为什么用

    本文链接:https://www.haomeiwen.com/subject/gwxjottx.html