如题,相信很多人在学习Core Graphics时都会用到带Ref后缀的类,这时可能很多读者会有疑问为什么要带Ref后缀呢。其实带有Ref后缀的类型是Core Graphics中用来模拟模拟面向对象机制的C结构。Core Graphics对象和Objective-C对象都是在堆上分配内存,因此创建一个Core Graphics对象时,同样会返回一个指向对象内存地址的指针。
使用这种分配方式的C结构都有一个用来表示结构指针(结构名后加一个 ***)的类型定义(type definition)。例如CGColor结构(不会直接使用的类型)有一个表示CGColor *的类型定义——CGColorRef(应该使用的类型)。使用这种类型定义是为了区分指针变量,方便开发者判断指针变量是指向C结构还是指向可以接收消息的Objective-C对象。
相反,部分类型没有结构指针,因此名称不带Ref后缀。例如CGRect和CGPoint,这些类型的数据结构简单,可以直接在栈上分配内存,因此不需要使用结构指针。
带有Ref后缀的类型的对象可能具有指向其他Core Graphics对象的强引用指针,并成为这些对象的拥有者。但是ARC无法识别这类强引用和对象所有权,必须在使用完之后手动释放。规则是,如果名称中带有copy或者create的函数创建了一个Core Graphics对象就必须调用对应的release函数并传入该对象指针。
网友评论