一、属性的修饰符 1.我们一块儿复习一下,我们以前学过的,属性的修饰符, 什么是属性的修饰符: 1)strong 2)weak 3)copy 4)assign 我们定义一个copy属性,@property(nonatomic,copy)NSString *name; // 属性修饰符 // strong // weak // assign // copy 2.字符串为什么要用copy, self.name = 我给它赋一个值,当然这个值是计算出来的,怎么计算出来的,我拼接字符串计算出来的,拼接字符串,我要用什么,NSMutableString , NSMutableString *str = [NSMutableString string]; NSMutableString *str = [NSMutableString string]; [str appendString:@“hello”]; self.name = str; 这么写,没问题吧,当这行代码self.name = str,执行完成之后,因为我程序是顺序往下执行的,我下面还要去拼接这个字符串,我再拼接一个字符串, [str appendString:@“zs”]; 我现在输出self.name, NSLog(@“%@”,self.name); 我输出的是hello,还是hello zs, 运行一下, 输出的是hello, 那,我们希望的这个self.name,是不是就是hello,这是我们希望的值吧,因为这块儿写的就是copy吧, 这块儿为什么用copy,如果这块儿不用copy,应该用什么,strong吧, NSString是不是一个类,这是一个对象,这是一个OC对象,所以如果不用copy的话,这块儿应该用,strong, 我们再来运行一下,如果这块儿是strong,输出的是hello、还是hellozs、 输出的是什么,hellozs, 为什么呢,当这个位置是copy的时候,输出的是hello、 当这个位置是strong的时候,输出的是hellozs、 当这个位置是copy和strong的时候,输出的结果是不一样的,为什么, 当是strong的时候,我们看一下代码是怎么去工作的,代码从上往下依次执行, 到这个位置,这个MutableString,有值了,有值之后,下面这行代码,这是关键, 把string,mutableString,是不是赋给了self.name, 它是什么,*str,带着星,说明是,地址, 所以,我们这个位置,在赋值的时候,如果我们这个name,是用strong修饰的, 这个name,是不是也带着一个星,这个name,是不是也是个地址,其实就是让self.name,这个地址,指向了str, 当str的值发生了变化,那我的self.name,是不是也发生了变化, 因为我的地址,是不是指向你了, 所以,当,MutableString的值,发生了变化,那我这个name的值,也发生了变化,这是我们不希望的,因为我们希望,这块儿,已经把这个人的名字,算好了,下面是算别的事情,我们不希望这样的事情发生,所以,这个string,应该改成,copy, 那,改成copy,又是什么意思呢,改成copy以后,执行这行代码的时候, self.name = str; 改成copy之后,执行这行代码的时候,会对这个str,先做一次copy操作,先复制了一份儿,我们在对MutableString,进行copy操作的时候,就是把可变,变成了不可变,复制了一个不可变对象,所以,复制了一份儿,等于这个self.name, 那,将来,不管你这个MutableString怎么变,我这个name,都是不会变化的,因为复制了一份儿, 我们把这儿改成strong,我们把这儿,加一个copy, 我们运行,结果是什么,hello、还是hellozs、 运行,结果是hello,是不是就跟我们刚才分析的结果是一样的, 那这块儿改成copy,其实就是自动的帮我们做了一下这件事情, 这就是字符串为什么用copy, 字符串为什么用copy:当给这个属性赋值,mutableString的时候,如果用strong修饰的话,那它是一个地址的指向,然后,当mutableString的值发生了变化,我们name的值,指向的是,始终是最新的那个值,我们需要把这儿改成,copy, 这是字符串为什么要用copy,接下来再来看,谁还要用copy修饰, 2.block,为什么要用copy, 这个之前讲过没,我们先把前面的注释起来,再来看第二个, 看第二个的话,我们先要定义一个block,block怎么定义的, 先写返回值,void,block就是一个函数, 所以,定义block的时候,就想函数的那个三要素, void ()() 返回值 - 函数的名称 - 参数 但是block比较特殊,要加一个^, void (^demo)() = ^ { } ; 其实,我们省了一个东西,这个位置,有个小括号呢,