• 对象属性:指针,指向某个单一的,代表某个值的对象,如NSString对象保存,如NSString对象或NSDate对象。又如,可以将员工的姓用NSString对象保存。也就是说,为了保存员工的姓,BNREmployee实例可以有一个相应的实例变量,该变量是一个指向NSString实例的指针。我们推荐你每次都声明属性,这样就不需要自己创建存取方法。
  • 一对一关系:指针,指向单个复杂的对象,例如,员工可能会有配偶。因此,BNREmployee实例可以有一个相应的实例变量,该变量是一个指向BNRPerson实例的指针。再次,我们推荐你每次都声明属性,这样就不需要自己创建存取方法。
  • 一对多关系:指针,指向某个collection类的实例,如NSMutableArray实例。例如,员工可能会有小孩。因此,BNREmployee实例可以有一个相应的实例变量,该变量是一个指向NSMutableArray实例的指针。这个NSMutableArray实例可以保存一组指针,指向一个或多个BNRPerson。一对多关系比对象属性及一对一关系复杂,需要自己穿件实例变量,存取方法及从关系中增加或一出对象的方法。

 

对象所有权与ARC(Object ownership and ARC)

与" 包含其他对象相比"相比,这种指向其他对象的特性会产生两大副作用:

  • 单个对象可能会扮演多个角色。例如,BNREmployee对象的spouse(配偶)可能还会被设置为多个child(孩子)的contact(紧急联系人)
  • 导致产生大量独立的对象,耗尽程序的可用内存。因此,需要保留正在使用的对象,并释放那些不用的对象(将其占用的内存还给堆),让系统能够重用这些对象所占用的内存。

 

  为了解决上述问题,Object-C提出了对象所有权(object ownership)概念。当某个对象(A)拥有某个对象实例变量(B)时,称A拥有B指向的对象。

  具体见(p153);

 

@class 的使用说明:

  注意@class BNRAsset;这行代码。当编译器在处理BNREmployee.h时,会遇到BNRAsset类。如果编译器不知道它,就会报错。

  @class BNRAsset;这行代码的作用时告诉编译器,程序有一个名为BNRAsset的类。

  当使用@class而不是#import时,编译器不会查看文件的全部内容,因此处理速度更快。之所以能够在 BNREmployee.h及其他头文件中使用@class,是因为编译器不需要知道实现细节就能处理文件中的所有声明。