{"record":{"id":"41681b6dbb421eda","repo":"EllanJiang/GameFramework","slug":"resource-target-0-reference-count-is-1-larger-than-0","errorCode":null,"errorMessage":"Resource target '{0}' reference count is '{1}' larger than 0.","messagePattern":"Resource target '(.+?)' reference count is '(.+?)' larger than 0\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"error","filePath":"GameFramework/Resource/ResourceManager.ResourceLoader.ResourceObject.cs","lineNumber":102,"sourceCode":"                    int referenceCount = 0;\n                    if (m_ResourceLoader.m_ResourceDependencyCount.TryGetValue(dependencyResource, out referenceCount))\n                    {\n                        m_ResourceLoader.m_ResourceDependencyCount[dependencyResource] = referenceCount + 1;\n                    }\n                    else\n                    {\n                        m_ResourceLoader.m_ResourceDependencyCount.Add(dependencyResource, 1);\n                    }\n                }\n\n                protected internal override void Release(bool isShutdown)\n                {\n                    if (!isShutdown)\n                    {\n                        int targetReferenceCount = 0;\n                        if (m_ResourceLoader.m_ResourceDependencyCount.TryGetValue(Target, out targetReferenceCount) && targetReferenceCount > 0)\n                        {\n                            throw new GameFrameworkException(Utility.Text.Format(\"Resource target '{0}' reference count is '{1}' larger than 0.\", Name, targetReferenceCount));\n                        }\n\n                        foreach (object dependencyResource in m_DependencyResources)\n                        {\n                            int referenceCount = 0;\n                            if (m_ResourceLoader.m_ResourceDependencyCount.TryGetValue(dependencyResource, out referenceCount))\n                            {\n                                m_ResourceLoader.m_ResourceDependencyCount[dependencyResource] = referenceCount - 1;\n                            }\n                            else\n                            {\n                                throw new GameFrameworkException(Utility.Text.Format(\"Resource target '{0}' dependency asset reference count is invalid.\", Name));\n                            }\n                        }\n                    }\n\n                    m_ResourceLoader.m_ResourceDependencyCount.Remove(Target);\n                    m_ResourceHelper.Release(Target);","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Resource/ResourceManager.ResourceLoader.ResourceObject.cs#L84-L120","documentation":"During Release (when not shutting down), GameFramework refuses to free a resource whose target still has a dependency reference count > 0, because unloading it would destroy memory that other assets depend on. It throws with the resource name and offending count, indicating an internal reference-counting inconsistency.","triggerScenarios":"A resource is released while m_ResourceDependencyCount still records references from other loaded assets/objects — e.g. release called before dependent assets were unloaded, custom code decrementing/releasing out of order, or callers forgetting to unload assets that incremented the count.","commonSituations":"Custom resource management that releases resources while scenes/UI still hold dependent assets; asymmetric acquire/release of AssetObjects; shutting down subsets of the resource system manually instead of on full shutdown (where isShutdown bypasses this check).","solutions":["Ensure every LoadAsset has a matching UnloadAsset so dependency counts drop to 0 before release.","Release resources only via the normal ResourceLoader eviction/shutdown flow, not manually.","Check custom code that decrements m_ResourceDependencyCount for missed or extra decrements.","If truly shutting down, use the shutdown path where isShutdown=true skips the check."],"exampleFix":"// before\nresourceComponent.UnloadAsset(uiAsset); // but dependent prefab assets still loaded\nresourceLoader.Release(resourceObject, false);\n// after\nforeach (var dep in dependentAssets) { resourceComponent.UnloadAsset(dep); }\n// then release only when reference count reaches 0","handlingStrategy":"try-catch","validationCode":"if (m_ResourceDependencyCount.TryGetValue(resourceObject.Target, out int count) && count > 0)\n{\n    Debug.LogError($\"Cannot release '{resourceObject.Name}': {count} dependency references remain.\");\n    return;\n}","typeGuard":null,"tryCatchPattern":"try\n{\n    resourceComponent.CheckResource / custom release path...\n}\ncatch (GameFrameworkException ex) when (ex.Message.Contains(\"larger than 0\"))\n{\n    Debug.LogError(\"Released a resource that still has dependent references; fix acquire/release pairing.\");\n}","preventionTips":["Pair every LoadAsset with an UnloadAsset so counts reach zero before release.","Never release resources manually; rely on ResourceLoader eviction/shutdown.","Audit custom code touching m_ResourceDependencyCount for balanced increments/decrements.","Only skip the check on full shutdown (isShutdown=true) where all resources are discarded."],"tags":["gameframework","unity","reference-counting","internal-invariant","resource-management"],"backgroundTag":"internal-invariant-violation","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}