Copy的简单使用
copy 的效果
<code class="hljs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">对源对象进行拷贝,建立出新的副本,彼此修改互不干扰!</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
###OC中copy的方法
copy–>建立对象的副本
- 如果对象有可变/不可变版本的区别,copy方法,只能拷贝出
不可变
的版本 - 如果对象没有可变/不可变的区别,copy方法就是建立一个副本
mutableCopy
* 建立对象的可变副本(如果对象有”可变/不可变”版本的区别,才需要使用此方法)
###副本的特点
彼此的内容一样,具有相同的方法
可变版本对象的copy
<code class="language-objc hljs scala has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/** 可变版本对象的copy 对于可变对象的copy/mutableCopy都是深拷贝 */</span> - (void)copyDemo1 { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// arrayM本身为可变对象</span> NSMutableArray *arrayM = [NSMutableArray array]; NSLog(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"源对象\t\t%@\t内存地址%p"</span>, arrayM.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>, arrayM); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// copy ---> 不可变 地址变化 新的对象</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 无论是可变对象,还是不可以变对象,copy之后都会编程 不可变</span> id a = [arrayM copy]; NSLog(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"copy后\t%@\t内存地址%p"</span>, [a <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>], a); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// mutableCopy => 可变 地址变化 新的对象,mutableCopy可以保持可变的特性</span> id aM = [arrayM mutableCopy]; NSLog(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"mutableCopy后%@\t内存地址%p"</span>, [aM <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>], aM); } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul>
运行结果:
<code class="hljs rust has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">源对象 <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">__</span>NSArrayM 内存地址<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7f91c2c1d940</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">copy</span>后 <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">__</span>NSArrayI 内存地址<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7f91c2e09a00</span> mutableCopy后<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">__</span>NSArrayM 内存地址<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7f91c2d23660</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
不可变版本对象的copy
<code class="language-objc hljs scala has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/** 不可变版本对象的copy */</span> - (void)copyDemo2 { NSArray *array = [NSArray array]; NSLog(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"源对象%@ 内存地址%p"</span>, array.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>, array); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// copy ---> 不可变 地址没有变化 引用计数+1</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 对于不可变对象的copy操作,进行的浅拷贝,系统并不会为之分配内存空间,仅仅是retainCount+1</span> id a = [array copy]; NSLog(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"copy后%@ 内存地址%p"</span>, [a <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>], a); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// mutableCopy ---> 可变 地址变化 新的对象</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 不可变的mutaleCopy的操作会变为可变对象</span> id aM = [array mutableCopy]; NSLog(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"mutableCopy%@ 内存地址%p"</span>, [aM <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>], aM); } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>
执行结果:
<code class="hljs rust has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> 源对象<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">__</span>NSArrayI 内存地址<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7fb4e07010d0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">copy</span>后<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">__</span>NSArrayI 内存地址<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7fb4e07010d0</span> mutableCopy__NSArrayM 内存地址<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0x7fb4e063daf0</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
小结:
-
不要随随变变给可变对象做 copy 操作
-
都会建立新的副本,深拷贝(只要有一个可以修改,就是深拷贝)
<code class="hljs brainfuck has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">可变</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span>> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">可变</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">可变</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span>> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">不可变</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">不可变</span> <span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span><span class="hljs-literal" style="color: rgb(0, 102, 102); box-sizing: border-box;">-</span>> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">可变</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>
-
不会建立新的副本,只是
引用计数+1
,浅拷贝,指针拷贝(两个对象前后都不需要修改)<code class="hljs fix has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-attribute" style="box-sizing: border-box;">不可变 </span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">》 不可变</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
Copy属性
在面向对象程序开发中,有一个非常重要的原则
####开闭原则
-开:对内开放,向怎么改,就怎么改
-闭:对外封闭,只能用,不能改
-
定义成 copy 属性,在设置数值的时候,会默认做一次 copy 操作
- 如果设置的数值是可变的,做一次copy,会新建副本
- 如果设置的数值是不可变的,做一次copy,只是引用计数+1,不会建立新的副本!跟strong类型一致的!
建议
:如果属性是 NSString,建议使用 copy 属性
注意
:可变字符串一定不要使用 copy 属性
<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 头衔,如果区分可变和不可变版本,做一次copy操作得到的就是不可变的字符串!</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">@property</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">nonatomic</span>, copy) <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableString</span> *title;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
对象的类型
- 1> 一个对象的准确类型,是在给该对象”分配内存空间”的时候指定的类型
- 2> 对象的”类型”,是程序员指定该对象的类型,指定类型之后,就可以具有该对象的方法!
- 3> 能否使用对象的方法,取决于运行时,这个对象的类型是否真的正确!
- 4> 如果类型不正确会出现 -[NSObject length]: unrecognized selector
<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableString</span> *strM = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableString</span> stringWithString:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"zhangsan"</span>]; Person *p = [[Person alloc] init]; p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span> = strM; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@"</span>, p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// zhangsan</span> [strM setString:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"lisi"</span>]; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"===> %@"</span>, p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// zhangsan</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 问题:p.name的类型 NSString & NSMutableString</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 答案:NSCFString ---> NSString</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// NSMutableString类型的数据做了一次copy后,会变为不可变的NSString类型</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">id</span> obj = p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span>; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@"</span>, [p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span> class]); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// NSCFString</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// [obj setString:@"wangwu"]; // 报错,不应该对NSString进行修改</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"===> %@"</span>, p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// wangwu</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul>
<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableString</span> *strM = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableString</span> stringWithString:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"zhangsan"</span>]; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSString</span> *str = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"haha"</span>; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%p"</span>, str); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 0x10a182138</span> Person *p = [[Person alloc] init]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// p.name = strM;</span> p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span> = str; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%p"</span>, p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//0x10a182138 跟 str地址是一样滴~,p.name指向了str的空间</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@"</span>, p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// haha</span> [strM setString:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"lisi"</span>]; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"===> %@ %@"</span>, p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span>, strM); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// p.name 和 strM不可能一样,strM的改变不会影响到p.name</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>
<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 从网络获取到一个字符串</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableString</span> *strM = [<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSMutableString</span> stringWithString:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"BOSS"</span>]; Person *p = [[Person alloc] init]; p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.title</span> = strM; [strM setString:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"经理"</span>]; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"===> %@ %@"</span>, p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.title</span>, strM); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// Attempt to mutate immutable object with setString:</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 试图使用 setString: 方法修改"不可变对象"?</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// setString方法,是title存在之后,修改title的内容!</span> [p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.title</span> setString:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"jingli"</span>]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 程序会崩掉,p.title为不可变对象</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"!!!!> %@ %@"</span>, p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.title</span>, strM);</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>
Copy的自定义对象
-
在很多商业级应用程序或者第三方框架,在开发时的模型通常会支持 copy
NSCache & NSMutableDictionary
<code class="hljs vbnet has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">-NSCache 的 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">key</span> strong 的 -Dict 的 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">key</span> 是 copy 的</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
// NSMutableDictionary *dictM = [NSMutableDictionary dictionary];
// dictM setObject:<#(id)#> forKey:<#(id<NSCopying>
)#> -
如果自定义对象要当作字典的 key,需要支持 copy!
Person.h
<code class="language-objc hljs java has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/** 要让自定义对象支持 copy,需要做两件事情 1. 遵守 NSCopying 协议 2. 实现 copyWithZone: 方法 */</span> <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@interface</span> Person : NSObject <NSCopying> <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@property</span> (nonatomic, copy) NSString *name; <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@property</span> (nonatomic, assign) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> age; </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>
Person.m
<code class="language-objc hljs scala has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/** 有返回值 -》 copy 出来的新对象 是一个对象方法 -> 将 self 建立一个副本 zone: 空间,分配对象是需要内存空间的,如果指定了zone,就可以指定新建对象对应的内存空间 但是:zone是一个非常古老的技术,为了避免在堆中出现内存碎片而使用的 在今天的开发中,zone几乎可以忽略 如果对象没有 可变/不可变 的版本区别,只要实现 copyWithZone 方法即可 */</span> - (id)copyWithZone:(NSZone *)zone { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// copy 是要建立一个新的副本,和当前的对象具有相同的内容</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 1. 实例化 person 对象</span> Person *p = [[Person alloc] init]; p.name = self.name; p.age = self.age; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> p; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 只需要写模型的description就可以了,返回对象的描述信息,便于调试使用,类似于 java 中的 toString()</span> - (NSString *)description { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// JSON的格式和字典非常像</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// @{@"name": @"zhangsan", @"age": @(19)}</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> [NSString stringWithFormat:@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"<%@: %p> {name: %@, age: %d}"</span>, self.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>, self, self.name,self.age]; } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 也可以输出调试信息的字符串,专门用来调试使用的</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 有的网站上的培训资料会提到这个方法,跟 description 方法非常类似!</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 但是:如果在应用程序中,使用了这个方法,应用程序无法上架!苹果会认为使用了私有API</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//- (NSString *)debugDescription {</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//}</span> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul>
<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">- (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span>)viewDidLoad { [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span> viewDidLoad]; Person *p = [[Person alloc] init]; p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span> = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"zhangsan"</span>; p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.age</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">19</span>; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@--- %p"</span>, p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span>, p); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// zhangsan--- 0x7fbacbf17120</span> Person *p1 = [p copy]; p1<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span> = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"xiaofang"</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 注意,地址不同,说明实现了自定义对象的copy</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@--- %p"</span>, p1<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span>, p1); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// xiaofang--- 0x7fbacbe13900</span> } </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>
子类对象的Copy
<code class="language-objc hljs scala has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">#<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Person.h"</span> <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@interface</span> Student : Person <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 学号</span> <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@property</span> (nonatomic, copy) NSString *no; <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@end</span> ```objc <div <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"se-preview-section-delimiter"</span>></div> #<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Student.h"</span> <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@implementation</span> Student - (id)copyWithZone:(NSZone *)zone { <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 执行父类的 copy 方法,会把父类中的属性完全 copy</span> Student *s = [<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">super</span> copyWithZone:zone]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 在子类的copy方法中,只需要给子类特有的属性进行赋值即可!</span> s.no = self.no; <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> s; } <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@end</span> <div <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"se-preview-section-delimiter"</span>></div> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li></ul>
在父类的copyWithZone方法中:
要写:
<code class="language-objc hljs applescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> Person *p = [[self.<span class="hljs-type" style="box-sizing: border-box;">class</span> alloc] init]; p.<span class="hljs-property" style="box-sizing: border-box;">name</span> = self.<span class="hljs-property" style="box-sizing: border-box;">name</span>; p.age = self.age; <<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">div</span> <span class="hljs-type" style="box-sizing: border-box;">class</span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"se-preview-section-delimiter"</span>></<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">div</span>> </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>
不能写 Person * p = [[Person alloc] init];这么干了,只能copy出Person对象,不对子类起作用。
测试Demo
<code class="language-objc hljs objectivec has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 一个对象的准确类型,取决分配内存空间指定的类型</span> Person *p = [[Student alloc] init]; p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span> = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"zhangsan"</span>; p<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.age</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">19</span>; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 给对象指定的类型,决定了能够使用对象的哪些属性和方法</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// p.no = @"001";</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// NSLog(@"%@ %@", p, p.no);</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@"</span>, p); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// {name: zhangsan, age: 19}</span> <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// copy会执行父类的copy方法</span> Student *p1 = [p copy]; <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 虽然是父类的引用,但实际上copy的是子类</span> p1<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.name</span> = @<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"xiaofang"</span>; <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">NSLog</span>(@<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"%@ %@"</span>, p1, p1<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">.no</span>); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// <Student: 0x7fb0f9443150> {name: xiaofang, age: 19} (null)</span></code>