最近,重新对Three20进行了一些研究,通过阅读他人的一些文章以及官方文档,逐渐对Three20有了新的认识,不再是以前的对这个库只有一些用法上的理解,现在我理解的Three20是一个开源库,这个库分为6个模块,分别为:Core,UICommon,Style,UINavigator,Network,UI,这几个模块的依赖关系如下:
即最低层的是Core;依赖于Core的上层是UICommon与Network这两个模块,UINabigator依赖于UICommon与Core模块,因此,要使用UI,则必须将所有的库模块加入到工程的依赖库中。
Core模块中有个TTGlobalCore类,这个类中的第一个方法:
/**
* Creates a mutable array which does not retain references to the objects it contains.
*
* Typically used with arrays of delegates.
*/
NSMutableArray* TTCreateNonRetainingArray();
是用来实现一个非Retain的NSMutableArray,这种非Retain的NSMutableArray不会Retain加入到它里面的对象,一般用在类的delegates数组里面,因为delegate实例变量是weak reference的,不保存实现对象的实例。这个方法的实现如下:
// No-ops for non-retaining objects.
//下面定义的这两个方法定义非retain数组的retain与release操作。下面我们跳到COREFOUNDATION_CFARRAY的定义里面看看CFArray里面是什么,见标识LOOP
static const void* TTRetainNoOp(CFAllocatorRef allocator, const void *value) { return value; }
static void TTReleaseNoOp(CFAllocatorRef allocator, const void *value) { }
///////////////////////////////////////////////////////////////////////////////////////////////////
NSMutableArray* TTCreateNonRetainingArray() {
CFArrayCallBacks callbacks = kCFTypeArrayCallBacks;
callbacks.retain = TTRetainNoOp;
callbacks.release = TTReleaseNoOp;
return (NSMutableArray*)CFArrayCreateMutable(nil, 0, &callbacks);
}
LOOP:
/*!
@typedef CFArrayCallBacks
Structure containing the callbacks of a CFArray.
@field version The version number of the structure type being passed
in as a parameter to the CFArray creation functions. This
structure is version 0.//这个字段咱们不管
@field retain The callback used to add a retain for the array on
values as they are put into the array. This callback returns
the value to store in the array, which is usually the value
parameter passed to this callback, but may be a different
value if a different value should be stored in the array.
The array's allocator is passed as the first argument.//这个字段是对象加入array的时候的retain操作具体做的事情,可以自定义
@field release The callback used to remove a retain previously added
for the array from values as they are removed from the
array. The array's allocator is passed as the first
argument.//这个字段是对象被移出array的时候具体做的事情,可以自定义
@field copyDescription The callback used to create a descriptive
string representation of each value in the array. This is
used by the CFCopyDescription() function.//这个咱们不管
@field equal The callback used to compare values in the array for
equality for some operations.//这个咱们不管
*/
typedef const void * (*CFArrayRetainCallBack)(CFAllocatorRef allocator, const void *value);//这个是个函数类型声明,是我们对自定义的retain所做的事情的函数定义的原型
typedef void (*CFArrayReleaseCallBack)(CFAllocatorRef allocator, const void *value);//这个也是函数类型声明,是我们自定义的release所以的事情的函数定义的原型
typedef CFStringRef (*CFArrayCopyDescriptionCallBack)(const void *value);
typedef Boolean (*CFArrayEqualCallBack)(const void *value1, const void *value2);
typedef struct {
CFIndex version;
CFArrayRetainCallBack retain;
CFArrayReleaseCallBack release;
CFArrayCopyDescriptionCallBack copyDescription;
CFArrayEqualCallBack equal;
} CFArrayCallBacks;//这个是对array进行操作的回调函数结构体,我们可以通过自定义这个结构提里面的每个字段来进行一些自定义的操作,可能说的不是很清除,就是说咱们要自行定义一种容器,比如非retain型的NSMutableArray,咱们再回过头来看NSMutableArray* TTCreateNonRetainingArray()函数的定义。
NSMutableArray* TTCreateNonRetainingArray() {
CFArrayCallBacks callbacks = kCFTypeArrayCallBacks;
callbacks.retain = TTRetainNoOp;
callbacks.release = TTReleaseNoOp;
return (NSMutableArray*)CFArrayCreateMutable(nil, 0, &callbacks);
}
这里先定义了一个CFArrayCallBacks的变量callbacks,即定义了CFArray的回调函数结构体,还记得吗?里面有5个字段,不记得的同学看上面,然后给这个callbacks的retain字段喝release字段赋值,分别为TTRetainNoOp和TTReleaseNoOp,这两个东西的定义在前面已经列出来了,为:
static const void* TTRetainNoOp(CFAllocatorRef allocator, const void *value) { return value; }
static void TTReleaseNoOp(CFAllocatorRef allocator, const void *value) { }
这两给操作的具体定义是根据上面的说明来的,即array加入元素的时候,不要retainCount++,array移出元素的时候不要retainCount--。
哈哈,不知道各位看官明白了没有,没明白也没关系,自己再多看看应该就可以理解了,
最后调用CFMutableArrayRef CFArrayCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFArrayCallBacks *callBacks);这个函数来生成我们自己定义的非retain型的NSMutableArray对象,这个函数的返回值是CFMutableArrayRef类型的,进行强制类型转换就可以了。
浙公网安备 33010602011771号