; [stringMCopy appendString:@"!!"]; crash的原因就是copy返回的对象是immutable对象。...2、自定义对象的复制 使用copy和mutableCopy复制对象的副本使用起来确实方便,那么我们自定义的类是否可调用copy与mutableCopy方法来复制副本呢?...对于自定义的对象,在我看来并没有什么可变不可变的概念,因此实现mutableCopy其实是没有什么意义的,在此就不详细介绍了。...:' 这段错误提示不允许修改person的name属性,这是因为程序定义name属性时使用了copy指示符,该指示符置顶调用setName:方法时(通过点语法赋值时,实际上是调用对应的setter方法)...因此即使定义实例变量时使用了可变类型,但只要使用copy指示符,实例变量实际得到的值总是不可变对象。
,如果使用strong关键字有什么问题?...:@"mm"]; //crash [string appendString:@" origion!"]...; [stringMCopy appendString:@"!!"]; 运行以上代码,会在第7行crash,原因就是 copy 返回的对象是 immutable 对象。...这个类是 NSString 的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。...strong来定义不可变对象,它的子类可变对象,有可能该对象的指针指向他的子类,他的子类改变了,该对象也就改变了。
一个NSString对象就代表一个字符串(文字内容) 一般称NSString为字符串类 2....使用NSURL读写字符串 从URL中读取 // 用来保存错误信息 NSError *error = nil; // 创建URL路径 NSURL *url = [NSURL fileURLWithPath...字符串中的可变和不可变 不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化 // 改变了指针的指向, 并没有修改字符串 NSString *str = @"abc"; //...3.png 可变:指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改 NSMutableString *str = [NSMutableString string]; NSLog(@...字符串使用注意事项 @"abc"这种方式创建的字符串始终是NSString,不是NSMutalbeString。所以下面的代码创建的还是NSString,此时使用可变字符串的函数,无法操作字符串。
:@"hah"]; // 此时名字这个属性被修改了 NSLog(@"%@", xiaoMing.name); 如果用Copy来修饰name这个属性不会改变,如果使用Strong,当name这个字符串改变的时候...xiaoMing.name = name;(此时name是用copy修饰的) 等同于 xiaoMing.name = [name copy];(copy对可变对象进行的是深拷贝,此时是拷贝出了一个新的对象然后赋值给了...xiaoMing.name mutableCopy对所有的对象进行的都是深拷贝) 补充:这其实也是看需求,看被赋值的字符串是否需要随着赋值字符串的变化而变化,而大多数情况下我们不希望被赋值的字符串如某个对象的某个字符串类型的属性会随着赋值字符串的变化而变化...反之,如果我们希望被赋值的字符串随着赋值字符串的变化而变化,那么我们也可以使用strong来修饰字符串(赋值字符串和被赋值字符串说的好像挺绕口啊)。注:赋值字符串既然可变,那它就必然是可变字符串。...当我们确定赋值字符串是不可变字符串的时候我们是可以使用strong来修饰字符串。
集中常见的NSArray创建对象的方法如下: array:创建一个不包含任何元素的空NSArray arrayWithContentsOfFile:/ initWithContentsOfFile::读取文件内容来创建...NSSet表示元素个数和内容均不可变的集合,NSMutableSet则表示元素个数和内容可变的集合。...3、NSMutableSet继承自NSSet,它代表一个集合元素可变的NSSet集合。...当程序向NSCountedSet中添加一个元素时,如果NSCountedSet集合中不包含该元素,那么NSCountedSet真正接纳该元素,并将该元素的添加次数标注为1 ;当程序向NSCountedSet...该自定义类必须实现copyWithZone:方法,该方法最好返回该对象的不可变副本。
assign、weak、unsafe_unretained assign表示对属性只进行简单的赋值操作,不更改所赋的新值的引用计数,也不改变旧值的引用计数,常用于标量类型,如NSInteger,NSUInteger...assign也可以修饰对象如NSString等类型对象,上面说过使用assign修饰不会更改所赋的新值的引用计数,也不改变旧值的引用计数,如果当所赋的新值引用计数为0对象被销毁时属性并不知道,编译器不会将该属性置为...为确保这些不可变对象因为可变子类对象影响,需要copy一份备份,如果不使用copy修饰,使用strong或assign等修饰则会因为多态导致属性值被修改。...,因为Foundation框架提供的这些类都实现了NSCopying协议,使用copy方法返回的都是不可变对象,如果使用copy修饰符在对可变对象赋值时则会获取一个不可变对象,接下来如果对这个对象进行可变对象的操作则会产生异常...所以,针对不可变对象使用copy修饰,针对可变对象使用strong修饰。
方法时 readonly是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变 assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时; retain...strong:强引用,arc中使用,与mrc中retain类似,使用之后,引用计数+1;实例变量对传入的对象有所有权,即强引用。...strong根retain的意思相同并产生相同的代码,语意上更能体现对象的关系; weak:弱引用,arc中使用,如果传入的对象被释放了,其指向nil,可以有效的避免野指针,其引用计数为1; 说到底,strong...使用 copy 可以防止不可变的属性被赋值的是可变的数据时,因为可变数据的改变而改变属性的值。...:@"hello"]; Test *test = [[Test alloc]init]; test.str1 = str; test.str2 = str; [str appendString
一、字符串 1、NSString代表字符序列不可变的字符串,即一旦NSString对象被创建,包含在这个对象中的字符序列就说不可改变的,直至这个对象被销毁。...对象 调用NSDateComponents的getter方法获取个时间字段的数值 使用个时间字段的数值来初始化NSDate对象的步骤如下: 创建NSCalendar对象 创建一个NSDateComponents...mutableCopy方法用于复制对象的可变副本,通常来说,mutableCopy方法返回的副本对象总是可修改的(MutableString等),即使该原始对象是不可修改。...[strCopy appendString:@".org"]; 23 NSLog(@"%@" , strCopy); 24 // 调用book(可变字符串)的copy方法...27 [bookCopy2 appendString:@"aa"]; 28 } 29 } 2、当程序调用对象的copy或mutableCopy方法时,实际上程序底层需要调用
copy的概念特点 copy产生一个新副本的过程,利用一个原对象产生一个新对象 copy:创建一个不可变的副本(NSString\NSArray\NSDictionary) mutableCopy...:创建一个可变的副本 (NSMutableDictionary\NSMutableArray\NSMutableString) 修改新文件或原文件,不会影响原文件或新文件 浅拷贝:如果没有生成新对象我们称为浅拷贝...2、不可变的字符串通过copy操作,没有生成新的对象,而是指向同一内存 3、不可变的字符串通过mutableCopy操作,生成新的可变对象,所以需要生成一个新对象 NSMutableString *str...2、可变的字符串通过copy操作,生成新的对象 3、可变的字符串通过mutableCopy操作,生成新的可变对象 copy的用途 property中使用的copy、strong修饰的区别 strong...]initWithFormat:@"lastNameStr-BB"]; p.lastName = lastNameStr; NSLog(@"%@",p.lastName); [lastNameStr appendString
通过两者的对比,咱们可以发现 ① Java使用@Override表示该函数重载父类的方法,而Kotlin使用小写的override 在同一行表达重载操作 ② Java 使用 protected /...默认参数的命名告一段落,如果函数定义里面的参数可变,这该怎么办呢?...以可变的字符串为例 Java写法“String…args”,而Kotlin中的写法“vararg args:Sting?”,函数内部解析的时候,Kotlin会把可变参数当成一个数组。...fun appendString(tag: String, vararg otherInfo: T?)...//该函数不接收Array也不接收Array fun setArrayNumber(array: Array) { var str
创建一个字符串对象: NSstring * str1 = @"hello"; NSString * str = [[NSString alloc]initWithString:@"hello world...compare:str2];//比较两个字符串的大小,str1大于 返回1 相等返回0 小于返回-1 long ret2 = [str1 caseInsensitiveCompare:str2];//不区分大小写比较字符串大小...(动态增加和减少的) 继承于NSString可以使用NSString的所有方法 NSMutableString * str = [[NSMutableString alloc]initWithString...:@"hello"];//将不可变的字符串转换为可变的字符串 [str insertString:@"123" atIndex:1];//在指定下标(不要越界)位置插入NSString类型字符串 [...str appendString:@"123"];//在字符串末尾追加字符串 [str deleteCharactersInRange:NSMakeRange(0, 2)];//从指定下标删除length
self.copyedString); NSLog(@"%@",self.copyedString); // 改變字符串,對比用strong和copy修飾的屬性的區別 [string appendString...copy修飾的屬性.正好符合咱們改變string 不會改變self.copyedstring的值,而self.strongstring的值已經改變了iOS block 为啥官方文档建议用 copy 修饰...(不可变对象和不可变集合对象),进行copy都是指针拷贝,进行mutablecopy都是内容拷贝。...对于可变对象(可变对象和可变集合对象),进行copy和mutablecopy都是内容copy。...不管是可变对象和不可变对象进行copy操作,产生的都是不可变的对象,进行mutablecopy操作产生的都是可变的对象。对任何一个对象进行深拷贝,都是单层深拷贝。
NSMutableString 是一个可以改变的对象,如果我们用 strong 修饰,NSString 对象强引用了 NSMutableString 对象。...假如我们在其他的地方修改了这个 NSMutableString 对象,那么 NSString 的值会随之改变。...关于copy修饰相关 1、对 NSString 进行 copy -> 这是一个浅拷贝,但是因为是不可变对象,后期值也不会改变; 2、对 NSString 进行 mutableCopy -> 这是一个深拷贝...进行 mutableCopy -> 这是一个深拷贝,拷贝出来一个可变的对象; 总结: 对对象进行 mutableCopy,不管对象是可变的还是不可变的都是深拷贝,并且拷贝出来的对象都是可变的; 对对象进行...是指针复制,而 mArrayCopy1 是对象复制,mArrayCopy1 还可以改变期内的元素:删除或添加。
9 NSString *book = @"我要学好iOS"; 10 11 //在str后面追加固定的字符串 12 //原来的字符串对象并不改变...18 NSLog(@"获取的c字符串:%s" , cstr); 19 20 //在str后面追加带变量的字符串 21 //原来的字符串对象并不改变...NSMutableString NSMutableString对象代表一个字符序列可变的字符串,而且NSMutableString是NSString的子类,因此前面介绍的NSString所包含的方法...,NSMutableString都可以直接使用,NSMutableString对象也可直接当成NSString对象使用。...appendString 30 [mstr appendString:@" and string C"]; 31 NSLog(@"%@" , mstr); 32
:retain、strong、copy三者的作用是一样的,即当引用的原对象值改变后,其他引用该对象的属性值不会受影响,还是保持原来的值; 2、对于可变对象来说:retain、strong和copy的作用就有区别了...,使用retain、strong修饰的属性,当引用的原对象值改变后,其他引用该对象的属性值会一起跟着变化,而copy修饰的属性的值还是保持原样。...copy的作用主要也是体现在这里: 让属性值不会随着原引用对象的值改变而改变; 3、retain和strong的区别:作用是一样的,只是写法上的区别。...所以,我们如果从效果来看的话,想要源字符串值的改变不引起属性字符串值的改变,只有当源字符串是可变字符串时,属性才需要用copy修饰,其他情况使用strong、retain修饰效果是一样的,虽然是指针拷贝...copy方法赋值给其他可变或不可变字符串,都是指针拷贝; 2)、不可变字符串使用mutableCopy方法赋值给可变或不可变字符串,和可变字符串使用copy方法或者mutableCopy方法赋值给其他可变或不可变字符串
像NSString这种对象,还有一个相关的叫NSMutableString。所以在非集合对象中又可以分为可变对象和不可变对象。...对他们进行copy与mutableCopy的含义是: 对于不可变非集合对象(如NSString),copy操作是浅复制,只会复制指针,mutableCopy操作是深复制, 对于可变非集合对象(如NSMutableString...mStringCopy = [string copy];// 深复制 NSMutableString *stringMCopy = [string mutableCopy];// 深复制 [mStringCopy appendString...先说说简单的浅复制与深复制,其实与非集合对象差不多: 对于不可变集合对象(如NSArray),copy操作是浅复制,只会复制指针,mutableCopy操作是深复制, 对于可变集合对象(如NSMutableArray...shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES]; copyItems设为YES会对集合中的每一个对象尝试做深复制
列表适合于在程序运行的时候,数据会发生改变的场合。但是有时候,我们不希望有些值被更改,希望它们在整个程序运行周期都不能被改变,Python将不能修改的值称为不可变的,而不可变的列表被称为元组。...元组是不可变对象,之前的字符串也是不可变对象。...my_tuple对象是元组类型。我们通常在定义元组的时候会使用圆括号()将元组给包括起来。但是圆括号并不是元组的标识。下面的例子展示了更多的关于元组的细节。...下面来尝试改变元组中元素的值,看看python解释器会报出什么样的错误信息。...my_tuple = 1,2,3,4,5 my_tuple[0] = 0 # 错误,不能修改不可变对象 尝试执行程序,可以看到错误提示如下: ?
KVO就是NSKeyValueObserving,请看官方文档的解释: 大概翻译如下: 一种非正式协议,通知其他对象的指定属性发生了改变。 简单理解就是,可以监听一个对象的某个属性是否发生改变。...你可以使用@required或者optional关键字指定方法是否必须实现。子类继承父类采用的协议。...,系统为我们动态添加了一个NSKVONotifying_+类名的类,因为我们改变对象属性的值是通过setter方法实现了,所以很明显是系统动态生成的NSKVONotifying_ZJPerson类重写了...dealloc:应该是处理对象销毁之前的一些收尾工作 _isKVOA:告诉系统使用了kvo 拓展 学任何东西,通过我们的思考一定会问出一些别的问题,通过深入了解kvo,下面两个问题,是面试经常会被问到的...:@"\n"]; [ivarStrs appendString:ivarName]; [ivarStrs appendString:@"-"]; [ivarStrs
在Objective C,这是通常被称为发送消息,不不过它的调用方法,还有好多我发现更加混乱. 在上面这种方法演示样例,methodName是所谓的选择器。一个选择器是一个方法的标识符。...有一个可变的字符串,必须使用NSMutableString配合其appendString,appendFormat等功能。尤其是appendFormat真的非常实用。...您须要使用他们可变泛型改变他们(比如NSMutableArray)。 假设你想存储原始类型,您须要使用NSNumber、NSValue等包装。...我曾经尝试套接字编程iQuassel项目有几个原因,主要由于你必须使用Carbon取代Cocoa。...假设你想获得位图的上下文,尝试UIGraphicsGetImageFromCurrentImageContext。
这里的 x 是一个不可变引用,因此尝试修改它的值(*x += 1)将导致编译错误。”...如果你有一个指向数据的指针或引用,你可以使用解引用来读取或改变这些数据。”...主要讨论了以下几个要点: Rust中,变量绑定是默认不可变的,即一旦一个值被绑定到一个变量,这个变量的值就不能再改变。但是,如果在声明变量的时候使用了mut关键字,那么这个变量就可以改变。...如果使用mut声明,可以重新赋值 默认情况下,变量赋值是可变的。赋值不涉及所有权或范围的概念。值被复制到预分配的内存中 默认情况下,变量赋值是可变的。需要使用new和delete进行显式内存管理。...支持不可变 (const T*) 和可变 (T*) 引用。 所需库支持 标准库中包含丰富的函数和宏来支持安全的引用操作。 标准库中不包含专门支持引用操作的特殊库,引用被视为对象的默认行为。
领取专属 10元无门槛券
手把手带您无忧上云