RacTestScheduler
用CFBinaryHeapRef存儲(chǔ)RACTestSchedulerAction
RACTestSchedulerAction是對(duì) date, block, disposable的封裝。
使用CFBinaryHeapAddValue方法把a(bǔ)ction寫(xiě)入。
使用CFBinaryHeapGetMinimumIfPresent 方法把a(bǔ)ction取出。
CFBinaryHeapCallBacks callbacks = (CFBinaryHeapCallBacks){
.version = 0,
.retain = &RACRetainScheduledAction,
.release = &RACReleaseScheduledAction,
.copyDescription = &CFCopyDescription,
.compare = &RACCompareScheduledActions
};
_scheduledActions = CFBinaryHeapCreate(NULL, 0, &callbacks, NULL);
static CFComparisonResult RACCompareScheduledActions(const void *ptr1, const void *ptr2, void *info) {
RACTestSchedulerAction *action1 = (__bridge id)ptr1;
RACTestSchedulerAction *action2 = (__bridge id)ptr2;
return CFDateCompare((__bridge CFDateRef)action1.date, (__bridge CFDateRef)action2.date, NULL);
}
是按照date的順序出隊(duì)列的。
也許取出有序性,是使用該結(jié)構(gòu)的原因~~
1、問(wèn)題1
不改變對(duì)象所有權(quán)。actionPtr拿到之后,并沒(méi)有保持強(qiáng)引用,然后立即調(diào)用CFBinaryHeapRemoveMinimumValue將actionPtr從CFBinaryHeapRef中刪除,這樣后面actionPtr不就是野指針了嗎?
const void *actionPtr = NULL;
if (!CFBinaryHeapGetMinimumIfPresent(self.scheduledActions, &actionPtr)) break;
//不改變對(duì)象所有權(quán)。actionPtr拿到之后,并沒(méi)有保持強(qiáng)引用,然后立即調(diào)用CFBinaryHeapRemoveMinimumValue將actionPtr從CFBinaryHeapRef中刪除,這樣后面actionPtr不就是野指針了嗎?
RACTestSchedulerAction *action = (__bridge id)actionPtr;
CFBinaryHeapRemoveMinimumValue(self.scheduledActions);
if (action.disposable.disposed) continue;
2、c類(lèi)型 用assign
assign不改變對(duì)象引用計(jì)數(shù)
///assign不改變對(duì)象引用計(jì)數(shù)
@property (nonatomic, assign, readonly) CFBinaryHeapRef scheduledActions;
dealloc中需要釋放