1.可变与不可变数组的关键字修饰
@property(nonatomic,strong) NSArray *array1;
@property(nonatomic,copy) NSArray *array2;
@property(nonatomic,strong) NSMutableArray *array3;
@property(nonatomic,copy) NSMutableArray *array4;
1,array 使用strong修饰不可变数组时,这时外部使用可变数组赋值时,会改变它的值会出现一些不必要的麻烦(当传入的array是可变对象且发生改变时,会导致属性跟着改变造成数据错乱,如果可以确定传入的数据是不可变的,可以用strong。).所以NSArray最好用copy去修饰,可变数组赋值给不可变数组,本质上只是把数组的元素传过去,并没有发生大家所说的深copy的实现,因为本质上数组的内存的地址没有变.
2, NSMutableArray用copy的话,会copy成NSArray 而不是NSMutableArray,传入一个array后,查元素会crash,所以最好用strong去修饰
2.NSString为什么要用copy关键字,如果用strong会有什么问题?
一般情况下,不可变对象(NSString,NSArray,NSDictionary等)使用copy修饰,可变对象(NSMutableString,NSMutabeArray,NSMutableDictionary等)使用strong修饰;
不可变对象可以接受子类对象,也就是说NSString可以接受NSMutableString,如果使用strong修饰,当传入的string是可变对象且发生改变时,会导致属性跟着改变造成数据错乱,如果可以确定传入的数据是不可变的,可以用strong。
注意,可变对象一定要用strong修饰,因为使用copy修饰后对象是不可变的,如果这时对可变对象进行修改会导致崩溃.
3.block相关
block的本质是一个指针结构体,
可能存放在3个地方:代码区(全局区)、堆区、栈区(ARC情况下回自动拷贝到堆区、因此ARC下只有两个地方:代码区和堆区)。如果不是ARC则存放在栈区,所在函数执行完毕就回释放,想再外面调用需要用copy指向它,这样就拷贝到了堆区,strong属性不会拷贝、会造成野指针错区。
Block结构体内部的isa指针是指向_NSContreteStackBlock的,其实这只是其中的一种,分别还有_NSContreteGlobalBlock 和 _NSContreteMallocBlock,block根据在内存中的位置分为三种:NSGlobalBlock,NSStackBlock,NSMallocBlock。block中没有用到局部变量会初始化为NSConcreateGlobalBlock,如果用到局部变量,在MRC中会初始化为NSConcreateStackBlock,ARC中会初始化为NSConcreateMallocBlock。block作为属性时使用copy修饰以保证MRC下将block拷贝到堆中,ARC下不使用copy修饰也会自动拷贝到堆中