void objc_release(id value) { if(objc_DecrementExtraRefCountWasZero(value)) { static SEL selector = NULL; if(selector == NULL) selector = sel_registerName("dealloc"); IMP dealloc = objc_msg_lookup(value, selector); dealloc(value, selector); } }
static volatile void __objc_thread_detach_function(struct __objc_thread_start_state *istate) { /* Valid state? */ if (istate) { id (*imp)(id,SEL,id); SEL selector = istate->selector; id object = istate->object; id argument = istate->argument; /* Don't need anymore so free it */ objc_free(istate); /* Clear out the thread local storage */ objc_thread_set_data(NULL); /* Check to see if we just became multi threaded */ if (!__objc_is_multi_threaded) { __objc_is_multi_threaded = 1; /* Call the hook function */ if (_objc_became_multi_threaded != NULL) (*_objc_became_multi_threaded)(); } /* Call the method */ if ((imp = (id(*)(id, SEL, id))objc_msg_lookup(object, selector))) (*imp)(object, selector, argument); else objc_error(object, OBJC_ERR_UNIMPLEMENTED, "objc_thread_detach called with bad selector.\n"); } else objc_error(nil, OBJC_ERR_BAD_STATE, "objc_thread_detach called with NULL state.\n"); /* Exit the thread */ objc_thread_exit(); }