static char* test_retain_counting() { LCStringRef test = LCStringCreate("abc"); mu_assert("initial retain count=1", objectRetainCount(test)==1); objectRetain(test); mu_assert("retain increases retain count", objectRetainCount(test)==2); objectRelease(test); mu_assert("releasing decreases retain count", objectRetainCount(test)==1); objectRelease(test); return 0; }
static void asyncOpUnlink(asyncOp *op) { if (op->list) { asyncOpList *list = op->list; if (list->head == op) list->head = op->next; if (list->tail == op) list->tail = op->prev; if (op->prev) op->prev->next = op->next; if (op->next) op->next->prev = op->prev; op->list = 0; // cqueue_ptr_push(&op->info.object->base->asyncOps, op); objectRelease(&op->info.object->base->pool, op, poolId); } }
extern int main(void) { Object *a[4]; int i, j; /* создадим комбинацию из 2-х реализаций с 2-мя контекстами */ a[0] = objectMultCreate(1); a[1] = objectAddCreate(1); a[2] = objectAddCreate(2); a[3] = objectMultCreate(2); for (i = 0; i < sizeof(a) / sizeof(a[0]); ++i) { printf("%d) ", i); /* вызов одной и той же функции-метода с одинаковым параметром для * разных указателей-объектов */ j = objectMethod(a[i], 3); printf(" = %d\n", j ); } for (i = 0; i < sizeof(a) / sizeof(a[0]); ++i) { objectRelease(a + i); } return 0; }
void objectReleaseAlt(void *object) { objectRelease(object); }