1

アプリのメモリ リークを修正し、外部クラスを使用する最善の方法を見つけようとしています。私はコロナ SDK でコーディングし、ストーリーボードを使用しています。クラスを介してオブジェクトを作成するときに、オブジェクトを適切に削除しているとは思いません。以下をご覧いただき、ご協力いただけますでしょうか

1) コードの最後に、キーボードを削除する方法を示します。キーボードは別のファイルで作成されているので、それで十分ですか、それとももっとやる必要がありますか?

2) keyboard.lua では、keyboard.lua ファイルが後で関数を使用してオブジェクトを操作できるように、オブジェクトを作成する必要があります。これは、theKeyboard、theCursor、theBackground を宣言することで行いました。

それらを M.theKeyboard、M.theCursor、M.theBackground と呼び、M がローカルであるため事前に宣言しないことに対して、それを行う理由はありますか?

3) このキーボード クラスを別の方法で実装しますか? もしそうなら、私にポインタを教えてもらえますか?

これがコード例です。このキーボード コードをアプリ全体で再利用したいと考えています。キーボードは常に 1 つだけにする必要があります。多くの画面ではキーボードが必要ないため、ユーザーがシーンを終了するときにキーボードを完全に削除したいと考えています。

-- keyboard.lua
local M = {}
local theKeyboard, theCursor, theBackground

function M.newBackground()
    if theBackground then 
       theBackground = nil
    end
    local newBackground = display.newRect(0,0,0,0)
    -- set position, size, color, etc
    theBackground = newBackground
    return newBackground
end

... many other functions to create cursor, textlabels, etc

function M.newKeyboard()
    if theKeyboard then 
       theKeyboard = nil
    end
    theKeyboard = display.newGroup()
    theCursor = M.newCursor()
    theBackground = M.newBackground()

    --  lots more stuff... like I create buttons for each key on the keyboard

    theKeyboard:insert(theCursor)
    theKeyboard:insert(theBackground)
    return theKeyboard
end

function M.removeKeyboard()
   display.remove(theCursor)
   display.remove(theBackground)
   display.remove(theKeyboard)
   theCursor = nil
   theBackground = nil
   theKeyboard = nil
end

return M

次に、私のアプリはストーリーボードを使用するため、キーボードをシーンに統合する方法の例を次に示します。

local keyboard = require ( "keyboard" )
local storyboard = require( "storyboard" )
local scene = storyboard.newScene()

local keyboardGroup, otherobjects 

function scene:createScene( event )
    local group = self.view
    keyboardGroup = keyboard.newKeyboard
    group:insert( keyboardGroup )
    end
end

-- other code


-- Called prior to the removal of scene's "view" (display group)
function scene:destroyScene( event )
    local group = self.view

    --  Is this sufficient for removing the keyboard completely?
        keyboard.removeKeyboard()
        keyboardGroup = nil
    end
end


---------------------------------------------------------------------------------
-- END OF YOUR IMPLEMENTATION
---------------------------------------------------------------------------------
-- additional code that comes with storyboard

return scene
4

2 に答える 2

5

してみてください -

if theKeyboard then 
   theKeyboard:removeSelf()
   theKeyboard = nil
end

私はそれがあなたの問題を解決すると思います。

于 2013-04-15T07:47:40.410 に答える
2

@Varshaの発言に加えて、このコードブロックが必要です。コロナでは、オブジェクトを削除するだけでは不十分です。collectgarbage() 関数が主な作業を行います。その後 object = nil と入力すると、ガベージ コレクターによって削除されます。

local monitorMem = function() -- Garbage collector

    collectgarbage()
    --print( "MemUsage: " .. collectgarbage("count") )

    local textMem = system.getInfo( "textureMemoryUsed" ) / 1000000
    --print( "TexMem:   " .. textMem )
end
Runtime:addEventListener( "enterFrame", monitorMem )
于 2013-04-15T14:07:45.387 に答える