【Objective-C笔记】—— 对象3

属性

@property NSString *itemName

声明一个属性时,会隐含地生成一个对应名称的实例变量和一对存取方法,其中实例变量会在变量名前加下划线

{
    NSString *_itemName
}
- (void) setItemName: (NSString *) name;
- (NSString *) itemName;

属性特性

@property (nonatomic, readwrite, strong) NSString *itemName

任何属性都有三个特性,每个特性都有多种不同的可选类型。在这些可选类型中,有一种是默认的

1. 多线程特性:nonatomic/atomic

大多要设置为nonatomic,因为不是默认的类型,所以必须明确写出

@property (nonatomic) NSString *itemName

2. 读写特性:readwrite(默认)/readonly

  • readwrite具备存取方法
  • readonly只具备取方法

3. 内存管理特性:strong(默认)/weak/copy/unsafe_unretained

  • strong强引用类型:指针变量指向某个对象,相应对象多一个拥有者,并且不会被程序释放
  • weak弱引用类型:可以让指针变量不影响其指向对象的拥有者个数,即对象的拥有者不变化,适合解决强引用循环问题(首先确定父-子关系,父对象使用强引用类型,子对象使用弱引用对象)
@property (nonatomic, strong) UItem *containedItem;
@property (nonatomic, weak) UItem *container;
  • unsafe_unretained类型的指针指向的对象被销毁时,指针成为空指针(弱引用类型指针指向的对象被销毁时,指针会自动设置为nil),造成过早释放,所以不安全。ps:是非对象属性的默认值
  • copy当属性是指向其他对象的指针,而且该对象的类有可修改的子类,如NSString/NSMutableStringNSArray/NSMutableArray,这时应该将设置为copy

自定义(覆盖)属性的存取方法

  • 对于readwrite类型的属性(readonly类推),如果只定义其中一个存(或者取)方法,则编译器只会创建默认的取方法和实例变量。
  • 如果既覆盖了存方法,又覆盖了取方法,那么编译器不会自动创建实例变量,此时获取不到属性对应的实例变量,如_itemName,会报错

你可能感兴趣的:(【Objective-C笔记】—— 对象3)