wyNode::~wyNode() { // nullify parent m_parent = NULL; #if ANDROID // clear handers setJavaVirtualMethods(NULL); setJavaTouchHandler(NULL); setJavaKeyHandler(NULL); setJavaAccelHandler(NULL); setJavaDoubleTapHandler(NULL); setJavaGestureHandler(NULL); #endif // remove from physics node queue if(m_velocityX != 0 || m_velocityY != 0 || m_accelerationX != 0 || m_accelerationY != 0) { if(gActionManager != NULL) gActionManager->removePhysicsNode(this); } // release members wyObjectRelease(m_camera); wyObjectRelease(m_grid); wyObjectRelease(m_downSelector); wyObjectRelease(m_upSelector); wyObjectRelease(m_moveOutSelector); removeAllChildrenLocked(true); wyArrayDestroy(m_children); m_children = NULL; if(m_timers != NULL) { wyArrayEach(m_timers, releaseTimer, NULL); wyArrayDestroy(m_timers); m_timers = NULL; } if(m_positionListener != NULL) { wyFree(m_positionListener); m_positionListener = NULL; } #if ANDROID if(m_dataIsJavaObject) { JNIEnv* env = getEnv(); env->DeleteGlobalRef(m_data.jo); m_dataIsJavaObject = false; } if(m_jPositionListener != NULL) { JNIEnv* env = getEnv(); env->DeleteGlobalRef(m_jPositionListener); m_jPositionListener = NULL; } #endif }
wyBladeRibbon::~wyBladeRibbon() { wyObjectRelease(m_texture); wyArrayEach(m_dyingBlades, releaseBlade, NULL); wyArrayDestroy(m_dyingBlades); wyArrayEach(m_reusableBlades, releaseBlade, NULL); wyArrayDestroy(m_reusableBlades); if(m_blade) { WYDELETE(m_blade); m_blade = NULL; } }
wyTMXTileMap* wyTMXTileMap::make(const char* path, bool isFile, wyTexture2D* tex1, ...) { wyTMXTileMap* tmx = WYNEW wyTMXTileMap(); // load tmx file wyMapInfo* map = wyTMXLoader::load(path, isFile); // collect first texture wyArray* textures = wyArrayNew(map->tilesets->num); wyArrayPush(textures, tex1); // collect other textures va_list texList; va_start(texList, tex1); for(wyTexture2D* now = va_arg(texList, wyTexture2D*); now != NULL; now = va_arg(texList, wyTexture2D*)) { wyArrayPush(textures, now); } va_end(texList); // init tmx->init(map, textures); // destroy temp list wyArrayDestroy(textures); return (wyTMXTileMap*)tmx->autoRelease(); }
wyB2BodyMeta::~wyB2BodyMeta() { for(int i = 0; i < m_arrayFixturedef->num; ++i) { b2FixtureDef* fixtureDef = (b2FixtureDef*)wyArrayGet(m_arrayFixturedef, i); delete fixtureDef->shape; delete fixtureDef; } wyArrayDestroy(m_arrayFixturedef); }
wyBitmapFontLabel::~wyBitmapFontLabel() { if(m_text) { wyFree((void*)m_text); } wyArrayEach(m_atlasList, releaseAtlas, NULL); wyArrayDestroy(m_atlasList); }
wyResultSet::~wyResultSet() { // close close(); // free sql wyFree((void*)m_sql); // free column names wyArrayEach(m_columnNames, releaseColumn, NULL); wyArrayDestroy(m_columnNames); }
wyPageControl::~wyPageControl() { #if ANDROID if(m_jCallback != NULL) { JNIEnv* env = wyUtils::getJNIEnv(); env->DeleteGlobalRef(m_jCallback); m_jCallback = NULL; } #endif m_scroller->release(); wyArrayEach(m_pages, releasePage, NULL); wyArrayDestroy(m_pages); }
wyTMXTileMap* wyTMXTileMap::make(int resId, wyTexture2D** tex, int texCount) { wyTMXTileMap* tmx = WYNEW wyTMXTileMap(); // load tmx file wyMapInfo* map = wyTMXLoader::load(resId); // collect textures wyArray* textures = wyArrayNew(texCount); for(int i = 0; i < texCount; i++) { wyArrayPush(textures, *(tex + i)); } // init tmx->init(map, textures); // destroy temp list wyArrayDestroy(textures); return (wyTMXTileMap*)tmx->autoRelease(); }
void wyDirector::commonDestroy() { g_Director_isEnding = true; // notify listener notifyDirectorEnded(); // stop dispatch events and remove all handlers gEventDispatcher->setDispatchEvent(false); // remove all textures gTextureManager->removeAllTextures(); // remove all actions gActionManager->removeAllActionsLocked(); // release auto release pool wyDestroyAutoReleasePool(); // free members wyObjectRelease(m_fpsLabel); if(m_runningScene != NULL) { m_runningScene->onExit(); m_runningScene->cleanup(); } if(m_screenshotPath != NULL) { wyFree((void*)m_screenshotPath); m_screenshotPath = NULL; } setRunningScene(NULL); setNextScene(NULL); wyArrayEach(m_scenesStack, releaseScene, NULL); wyArrayDestroy(m_scenesStack); wyArrayDestroy(m_lifecycleListeners); wyFree(m_clipStack); // clear singleton instance wyObjectRelease(gTextureManager); wyObjectRelease(gScheduler); wyObjectRelease(gEventDispatcher); wyObjectRelease(gActionManager); wyObjectRelease(gZwoptexManager); wyObjectRelease(gMWManager); wyObjectRelease(gSPXManager); wyObjectRelease(gSPX3Manager); wyObjectRelease(gArcticManager); wyObjectRelease(gAuroraManager); wyBitmapFont::unloadAll(); wyToast::clear(); // clear resource decoder gResDecoder = NULL; // now flush all existing auto release pool wyAutoReleasePool::flush(); // free mutex pthread_mutex_destroy(&gMutex); pthread_mutex_destroy(&gCondMutex); // check leak #ifdef WY_CFLAG_MEMORY_TRACKING wyOutputLeakPool(); wyClearLeakPool(); printUnreleasedMemory(true); #endif }
wyDirector_android::~wyDirector_android() { // if background running is enabled if(m_allowBackgroundRunning) { pthread_mutex_lock(&gCondMutex); if(m_backgroundRunning) { if(pthread_cond_init(&sBackgroundLooperCond, NULL) == 0) { m_backgroundRunning = false; pthread_cond_wait(&sBackgroundLooperCond, &gCondMutex); pthread_cond_destroy(&sBackgroundLooperCond); } } pthread_mutex_unlock(&gCondMutex); } // call gl view JNIEnv* env = wyUtils::getJNIEnv(); if(env != NULL) { if(m_glView != NULL) { if(!m_paused) env->CallVoidMethod(m_glView, g_mid_WYGLSurfaceView_onPause); env->DeleteGlobalRef(m_glView); m_glView = NULL; } } // if resource decoder is set, check whether it is wyJavaResourceDecoder if(gResDecoder) { wyJavaResourceDecoder* jrd = dynamic_cast<wyJavaResourceDecoder*>(gResDecoder); if(jrd) delete jrd; } // common destroy commonDestroy(); // release listener wyArrayEach(m_jLifecycleListeners, j_releaseListener, NULL); wyArrayDestroy(m_jLifecycleListeners); // deinit aal if(gAAL.deinit) gAAL.deinit(); // delete context ref if(env != NULL) { if(m_context != NULL) { env->DeleteGlobalRef(m_context); m_context = NULL; } } // global deinit globalDeInit(env); // unload sal lib if(sAALHandler != NULL) { /* * 不要close这个东西, 可能是因为android底层有什么bug, 导致重复载入卸载45 * 次之后就会出现问题. 而android上的dlopen又不支持RTLD_NODELETE这个flag, * 所以只能不close它, 就没事了 */ // dlclose(sAALHandler); sAALHandler = NULL; } // nullify gVM gVM = NULL; // free my self gDirector = NULL; }
wyAStarTile::~wyAStarTile() { wyArrayClear( m_childs); wyArrayDestroy(m_childs); m_childs = NULL; }
wyCombineColorFilter::~wyCombineColorFilter() { wyArrayEach(m_filters, releaseFilter, NULL); wyArrayDestroy(m_filters); }