-
strong表示指向并拥有该对象。其修饰的对象引用计数会增加1。该对象只要引用计数不为0则不会被销毁。当然强行将其设为nil可以销毁它。
@property (nonatomic, strong) MyClass *myObject; -
weak表示表示弱引用,指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,如果对象被释放,弱引用会自动变为
nil,避免悬挂指针(dangling pointer)问题。 使用场景: 通常用于防止循环引用(retain cycles),例如在 delegate 模式或闭包中。@property (nonatomic, weak) id<MyDelegate> delegate; -
assign主要用于修饰基本数据类型,如NSInteger和CGFloat,这些数值主要存在于栈上。但对于对象类型,如果对象被释放,assign 不会将指针置为
nil,可能导致悬挂指针。@property (nonatomic, assign) NSInteger count; -
weak 一般用来修饰对象,assign一般用来修饰基本数据类型。原因是assign修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃。而栈上的内存系统会自动处理,不会造成野指针。
-
copy与strong类似。不同之处是strong的复制是多个指针指向同一个地址,而copy的复制每次会在内存中拷贝一份对象,指针指向不同地址。copy一般用在修饰有可变对应类型的不可变对象上,如NSString, NSArray, NSDictionary。
@property (nonatomic, copy) NSString *name; -
Objective-C 中,基本数据类型的默认关键字是atomic, readwrite, assign;普通属性的默认关键字是atomic, readwrite, strong。