请说明并比较以下关键词:strong, weak, assign, copy

128 阅读1分钟
  • 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。

image.png