NSString为何要用copy修饰,而不是strong?

NSString本身是无所谓的,但是如果一个 NSString 指针指向了一个 NSMutableString的内存空间的话,如果使用 strong 修饰的话,如果你在别处修改这个值的话,那么原来的值也会改变。用 copy 是生成了一份新的内存空间,所以原值不会改变。

所以用copy是为了安全,防止NSMutableString赋值给NSString时,前者修改引起后者值变化而用的.

时间: 2024-10-01 04:17:07

NSString为何要用copy修饰,而不是strong?的相关文章

block要用copy修饰,还是用strong

栈区与堆区 block本身是像对象一样可以retain,和release.但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上.他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃.使用retain也可以,但是block的retain行为默认是用copy的行为实现的, 因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的

iOS之NSString类型为什么要用copy修饰

在开发的过程中,只知道NSString类型最好用copy修饰而不能用strong,但是不知道为什么,今天了解了下,总算搞明白了. 如下所示,当修饰符为copy时,因为NSMutableString是NSString类型的子类,所以可以用指针self.name指向mStr,但是我们知道copy的含义是指当重新赋值时深拷贝新对象再赋值给self.name, 所以此时self.name的指针和mStr的指针指向的对象就不同了,所以当给mStr对象发送方法appendString的时候,修改的只是mSt

NSString用copy修饰的原因

一言以蔽之:为了安全! 当一个可变字符串(NSMutableString)赋值给一个字符串属性(无论这个字符串是NSString还是NSMutableString), 如果此属性是retain修饰的,就是浅拷贝,引用计数加1.赋值后源字符串改变,这个属性值也跟着改变. 如果此属性是copy修饰的,就是深拷贝,引用计数等于1(因为从堆里新分配一个内存块).赋值后源字符串改变,这个属性值不会改变.(保证了安全) 假设对象有下面4个属性: 1 @property (retain, nonatomic)

IOS 关于NSString类型的属性为什么有时用copy,有时用strong呢?

对于很多初学者,发现在修饰NSString类型的对象时,会有这样的疑惑?怎么有些人用strong修饰,而有些人用copy修饰呢? 这里有个例子,一.首先声明2个属性: @property (nonatomic,copy) NSString *CopyName; @property (nonatomic,strong) NSString * StrongName; 1.1.创建一个可变字符串,方面后面作变化更改. NSMutableString* MutableName = [NSMutableS

iOS内存管理(4)--Block属性用copy修饰 & 避免循环引用的问题

一.Block的类型 根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock. NSGlobalBlock:类似函数,位于text段: NSStackBlock:位于栈内存,函数返回后Block将无效: NSMallocBlock:位于堆内存. 二.Block的copy.retain.release操作 不同于NSObjec的copy.retain.release操作: Block_copy与copy等效,Block_relea

关于NSArray使用时用strong修饰还是copy修饰问题测试

大家都知道,使用NSMutableArray时是用strong修饰,例如: [objc] view plain copy @property (nonatomic,strong) NSMutableArray * mutableArray; 但是,NSArray呢?我看大多数人都直接使用strong,而且网上还有很多人说除了NSString用copy,其他对象类型都用strong. 那么,问题来了:当用strong修饰NSArray的时候,如果遇到用可变数组给它赋值怎么办?会导致意料之外的bug

NSString 属性为啥用copy 不用strong

copy不能修改,strong可以修改,防止字符串被意外修改.demo: ------------------code 你要的 demo------------------ @property (nonatomic, copy) NSString * copystring; @property (nonatomic, strong) NSString *strongString; NSMutableString *string = [NSMutableString stringWithStrin

针对NSString的copy修饰前后,引用计数的变化

1 NSLog(@"NSString的对象,用NSString来接---------------------------------"); 2 NSString *string1 = [[NSString alloc]initWithFormat:@"不可变字符串"]; 3 NSLog(@"copy前,不可变字符串的引用计数 = %ld", [string1 retainCount]); 4 5 NSString *copyString1 = s

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