retain,copy,assign,nonatomic,atomic,strong,weak

属性与成员变量的区别(在早期的时候,声明属性必须要同时定义一个与其相对应的成员变量,后来不需要这么做了):
成员变量:

  1. 成员变量的默认修饰是@protected。???
  2. 成员变量不会自动生成set和get方法,需要自己手动实现。
  3. 成员变量不能用点语法调用,因为没有set和get方法,只能使用->调用,但是外部调用的时候,因为是protected所以还是无法调用。
    属性
  4. 属性的默认修饰是@protected。
  5. 属性会自动生成set和get方法。
  6. 属性用点语法调用,点语法实际上调用的是set和get方法。

@property

自动生成变量,get,set

retain,copy,assign,nonatomic,atomic,strong,weak

nonatomic:非原子性访问,不能保证多线程下的数据安全(多线程下同时对一个值进行读写操作,结果不确定)
atomic:默认属性,原子访问,多线程下的表现,大部分时候可以保证线程安全,但是atomic只会对指针内存地址进行加锁,不会对指针指向的值地址进行加锁,即atomic的指针是线程安全,但是指针的值不是线程安全,若修改其内部属性,则还是会出现线程不安全的问题。
是否会引起死锁问题?

MRC下:

retain:retain是指针拷贝,引用计数加1,则先释放旧对象(若有的话),再进行赋值。
assign:简单赋值,不更改索引计数。

ARC下:

strong:同retain
weak:同assign,区别在于当assign指向的地址引用计数为0时,可能不会马上释放(野指针)。

copy:

copy:copy是内容拷贝,也会先释放旧对象。
copy默认会执行copyWithZone(可重写实现深拷贝,对ary无效)方法。
浅拷贝(copy,拷贝地址),
深拷贝(拷贝地址指向的内容),
不完全拷贝(NSArray,NSDictionay等容器对象的深拷贝),
完全拷贝(相对于不完全拷贝的,需要自己实现的。)
copy的使用:
解决部分多态(父类指针可以指向子类的问题)问题。
修饰block(block默认创建在栈区,使用copy可以放在堆区):所以在MRC下应该用copy属性,在ARC下可以用strong。
特殊内存:非可变常量-nsstring(比较短的nsstring)。

你可能感兴趣的:(retain,copy,assign,nonatomic,atomic,strong,weak)