assign、weak、strong、copy

iOS开发时,大家都知道定义属性类型(属性修饰符)一般遵循以下规律:

  • 基本数据类型使用assign
  • NSString/NSData/NSArray使用copy
  • delegateblock等类型属性使用weak
  • 其他一般的都使用strong

大家都知道这么使用,但是其中的道理其实我不是很多,今天就总结一下。

  • assign一般都用于描述基本数据类型的属性,因为基本数据类型的属性是分配在栈内存(stack),系统自我控制对栈内存空间,一般不用的内存空间会立即被释放,不会造成野指针问题。如果对对象也使用assign去描述,而对象会被定义在堆内存(heap),而当对象被释放后,其内存地址指针并没有及时置成nil,可能造成野指针。
  • copy描述的属性,内部实现的方法是调用属性的set方法,然后对传入的参数使用copy方法,然后赋给该属性。
@property (nonatomic, copy) NSString *name;

- (void)setName:(NSString *)name {
    _name = [name copy];
//使用copy描述的属性,会对传入的参数,调用copy方法。

/**
*如果传入的是NSMutableString的实例,调用copy方法,会返回NSString的实例。
*如果外界再对NSMutableString的实例进行修改,不会修改该属性。
*所以使用copy保证了属性不会被改变。
*/
}
  • weak一般用于描述代理和block类型的属性。因为一般的代理的实现机制(以tableView举例来说):tableView的一个属性delegate,然后在一个控制器(viewController)用strong类型定义一个属性tableView,然后在代码中self.tableView.delegate = self;如果delegate如果用strong描述,则会造成循环引用。


    assign、weak、strong、copy_第1张图片
    代理的引用关系.jpg
  • strong一般用于其他类型的对象。

你可能感兴趣的:(assign、weak、strong、copy)