1

1つの関数内にテーブルを設定し、後の呼び出しで受け取った値を使用して、使用後に各値を削除しようとしています。何らかの理由で、関数呼び出し間で値が保持されていません。ハンドルを保持するテーブルは、subscribeToService()が呼び出されたときにデータが入力されてから、でデータが削除される必要がありunsubscribeToService()ます。

local subscriptionSignals_AudioMixerManager = {"volumeLevel", "muteStatus", "fadeLevel", "balanceLevel", "bassLevel", "trebleLevel", "midLevel", "AVCLevel", "activeAudioSrc", "interruptSrc"}
local signalHandlers_AudioMixerManager = {["volumeLevel"] = OnSignal, ["muteStatus"] = OnSignal, ["fadeLevel"] = onSignal, ["balanceLevel"] = OnSignal, ["bassLevel"] = OnSignal, ["trebleLevel"] = OnSignal, ["midLevel"] = OnSignal, ["AVCLevel"] = OnSignal, ["activeAudioSrc"] = OnSignal, ["interruptSrc"] = OnSignal}
local subscriptionHandles_AudioMixerManager = {}

local subscriptionSignals_AudioManager = {"targetSource"}
local signalHandlers_AudioManager = {["targetSource"] = onAudioSourceChange}
local subscriptionHandles_AudioManager = {}

local function subscribeToService(objectPath, signalNames, signalHandlers, subscriptionHandles)
    print("Subscribing...")
    for i,v in ipairs(signalNames) do
            subscriptionHandles[v] = service.subscribe(objectPath, v, signalHandlers[v]);
            print(v .. " handle: ")
            print(subscriptionHandles[v])
        end
    print("Done subscribing")
end

local function unsubscribeFromService(subscriptionHandles)
    print("Unsubscribing...")
    for i,v in ipairs(subscriptionHandles) do
            print("Entered for loop")
            service.unsubscribe(v)
            print(v)
            subscriptionHandles[i] = nil
        end
    print("Done unsubscribing")
end

local function subscribe()
    subscribeToService(AudioMixerManager, subscriptionSignals_AudioMixerManager, signalHandlers_AudioMixerManager, subscriptionHandles_AudioMixerManager)
    subscribeToService(AudioManager, subscriptionSignals_AudioManager, signalHandlers_AudioManager, subscriptionHandles_AudioManager)

    local result, error = service.invoke(AudioMixerManager, "registerMuteClient", {serviceName="audioSettings-interrupt"})
    muteClientID = result.id
    result, error = service.invoke(AudioMixerManager, "registerMuteClient", {serviceName="audioSettings-modechange"})
    muteClientID2 = result.id
end

local function unsubscribe()
    unsubscribeFromService(subscriptionHandles_AudioMixerManager);
    unsubscribeFromService(subscriptionHandles_AudioManager);
end

subscribe()が呼び出された後、後で出力として次のようになりますunsubscribe()

Subscribing...
volumeLevel handle:
userdata: 18f418
muteStatus handle:
userdata: 18f490
fadeLevel handle:
userdata: 18f508
balanceLevel handle:
userdata: 18f580
bassLevel handle:
userdata: 18f5f8
trebleLevel handle:
userdata: 18f670
midLevel handle:
userdata: 18f6e8
AVCLevel handle:
userdata: 18f760
activeAudioSrc handle:
userdata: 18f7d8
interruptSrc handle:
userdata: 18f850
Done subscribing
Subscribing...
targetSource handle:
userdata: 18f8c8
Done subscribing

Unsubscribing...
Done unsubscribing
Unsubscribing...
Done unsubscribing

unsubscribeFromService()渡されているテーブルが何らかの理由で空であることを意味すると私が信じているforループに入っていないようです。Luaでテーブルが参照によって渡されない状況はありますか?小さいコンポーネントを分解して個別にテストしたところ、動作しているように見えるため、この動作を説明している可能性があります。

4

2 に答える 2

4

これは、そこにあるコードの量によって複雑になりすぎた基本的なエラーです。この単純化された例を考えてみましょう。

local t = {}
t["asdf"] = {}

for i,v in ipairs(t) do
    print(i, v)
end

これは何も印刷しません!しかし、何が得られますか?tには間違いなく何かがあります!

問題は、ipairs()がテーブル内の数値インデックスのみを反復処理するが、文字列キーを使用して値を挿入していることです。代わりにpairs()を使用するように切り替えるか、数値インデックスを使用してsubscriptionHandlesテーブルに値を挿入する必要があります(おそらく必要なものではありません)。

于 2012-11-09T16:29:02.573 に答える
2

Luaでは、テーブルは常に参照によって渡されます。subscribe()これは、とunsubscribe()呼び出しの間で起こっていることは次のいずれかであることを意味します。

  • subscriptionHandles_AudioMixerManagersubscriptionHandles_AudioManager空のテーブルが割り当てられます。
  • subscriptionHandles_AudioMixerManagerおよびのすべての要素はsubscriptionHandles_AudioManagernilに設定されます。
于 2012-11-09T16:24:21.910 に答える