第10条:在既有类中使用关联对象存放自定义数据

在对象中存放相关信息的方式:

1、从对象所属的类中继承一个子类,然后改用这个子类对象。

  然而有时类的实例可能是由某种机制所创建的,无法使用这种机制创建自己所写的子类实例。所以采用第2种方式-----“关联对象”

2、关联对象

  可以给某对象关联多个对象,这个对象用“键”来区分,存储对象值的时,可以指明“存储策略”。存储策略由名为objc_AssociationPolicy的枚举所定义。

  对象的关联类型:

    OBJC_ASSOCIATION_ASSIGN     等价于  assign

    OBJC_ASSOCIATION_RETAIN_NONATOMIC     等价于  nonatomic, retain

    OBJC_ASSOCIATION_COPY_NONATOMIC     等价于  nonatomic, copy

    OBJC_ASSOCIATION_RETAIN     等价于  retain

    OBJC_ASSOCIATION_COPY     等价于  copy

  

  管理关联对象的方法:

    void objc_setAssociatedObject (id object, void *key, id value, objc_AssociationPolicy policy)  //以键和策略为某对象设置关联对象值

    id objc_getAssociatedObject (id object, vod *key)   //以键获取值

    void objc_removeAssociatedObject (id object)   //移除指定对象的全部关联对象。

    //为确保关联对象属于同一对象。所以键值要保持不变。通常使用静态全局变量做为键

  例: 在使用UIAlertView控件时,将view和block这两对象关联起来,这样就不用将处理放入delegate方法中了,代码放一起了。

    但实际UIAlertView使用频繁,第二种方式就不是最佳方式了,建议采用第1种方式(继承子类)。

只有在其他做法不可行时才考虑选用关联对象,因为这种做法通常会引用难于发现的bug。

    

时间: 2024-08-18 05:23:37

第10条:在既有类中使用关联对象存放自定义数据的相关文章

Effective-OC 10.在既有类中使用关联对象存储自定义数据

EOC中介绍与案例 有时候需要在对象中存放相关的信息 这时候我们通常会从对象所属的类中继承一个子类,然后改用这个子类对象.然而并非所有的情况都能这么做.有的时候 类的实例可能是由某种机制创建的,而开发者无法令这种机制创建出自己写的子类的实例,OC中有一强大的特性可以解决这个问题 就是"关联对象" 可以给某对象关联许多其他的对象 这些对象通过"键"来区分.存储对象值得实惠 可以指明"存储策略",用以维护相对应的"内存管理语义".

建议10:必须知道如何实现类比较器 接口实现对象排序

建议10:必须知道如何实现类比较器 所谓的比较器就只是一个接口,也只需要实现一个方法(public int CompareTo(object obj)).实现了比较器有什么用呢?除了顾名思义的可以比较两个实例的大小.还可以用来排序(比如是List集合,就直接调用.Sort()方法就可以 了.方便至极.定义Salay class: public class Salary : IComparable<Salary> { public int RMB { get; set; } public int

第14条:在公有类中使用访问 方法而非公有域

Class Point { public double x; public double y; } 如上面Point类的数据域是可以直接被访问的,这样的类没有提供封装.如果不改变API,就无法改变它的数据表示法(比如,使用一个比double更高精度的类来表示x和y),也无法强加任何约束条件(比如以后我们可能会希望x和y不会超过某个值). Class Point { private double x; private double y; public Point(double x, double

多文档中建立一个对话框类,通过这个方法来在其他类中得到对话框对象指针,访问对话框成员

{ // 添加内容 m_pDrawTool = new CDrawToolDlg; m_pDrawTool->Create(IDD_DRAWTOOLS, this); m_pDrawTool->ShowWindow(SW_SHOW); // 让窗口出现在屏幕右下方 CRect dlgRect; CRect mainRect; m_pDrawTool->GetClientRect(&dlgRect); GetWindowRect(mainRect); // 计算显示的坐标 int

mybatis中的关联对象查询

方式1(嵌套查询): 在本类的mapper映射配置文件中的ResultMap标签中使用association子标签,对关联对象的属性进行关联 例如:User中关联Department(多对一) ----------User的mapper映射配置文件---------<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Map

第十四条:在公有类中使用访问方法而非公有域

对于一些退化类(没有什么作用,只是用来集中实例域,也可认为是Java Bean). 如果这样的类是公有类,也就是我们希望客户端代码可以访问这些退化类的实例域,不应该直接使用public来暴漏这些数据域, 而是应该私有域和公有设值方法(setter)来代替.这样做的好处是,如果我们一旦需要改变这个退化类的内部结构,客户端 代码所受的影响最小.否则,如何客户端代码直接使用公有的数据域,这样的代码遍布各处,我们再修改退化类,就很困难了. 如果这样的类是包级私有的,或者是私有的内部类,也就是说这个退化类

IOS中AppDelegate类中的方法触发时机-----自定义AppDelegate的写法

@implementation AppDelegate //当应用程序加载时触发,创建window窗口对象,让对象的window成为程序的主窗口,并且可视. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen ma

PHP 类中给函数参数传自定义函数

class klass{ public function index(){ $names = array('firstname' => "Baba", 'lastname' => "O'Riley"); array_walk($names, array(__CLASS__, 'escape_data')); foreach ($names as $name) { print "$name\n"; } } public function

《Effective Objective-C 2.0》—(第6-10条)—对象、属性、equalToString、关联对象

用OC等面向对象语言编程时,"对象"(object)就是"基本构造单元"(building block),开发者可以通过对象来存储并传递数据.在对象之间传递数据并执行任务的过程就叫做"消息传递"(Messaing). 当应用程序运行起来以后,为其提供相关支持的代码叫做"Objective-C运行期环境"(Objevtive-C runtime),它提供了一些使得对象之间能够传递消息的重要函数,并且包含创建类实例所用的全部逻辑.