0

我在 iOS/Kobold2d 项目中使用 CCBigImage,因为精灵太大而无法立即加载。不幸的是,在执行应用程序时它会停止

ERROR: Uncaught exception -[CCTextureCache
addImageFromAnotherThreadWithName:target:selector:]: unrecognized
selector sent to instance 0xa17d010

将 plist 文件加载到 CCBigImage 时。我把它钉在了这样的地步

CCBigImage* bg = [CCBigImage nodeWithTilesFile:@"bg1dot5.plist" tilesExtension: @"pvr.ccz" tilesZ: 0]

调用 CCBigImage load()。该方法调用

[CCTextureCache sharedTextureCache] addImageFromAnotherThreadWithName: _imageName
                                                               target: self
                                                             selector: @selector(loadedTexture:)

最终导致指定的异常。我将“CCTextureCache+CCBigImageExtensions.h”导入到加载 CCBigImage 的源文件中,所以我希望将给定的选择器添加到 CCTextureCache 但显然不是。

我正在使用 Kobold2d 1.1.0 和 XCode 4.3.3(所以所有最新版本)。为了包含该选择器,我还需要做些什么吗?

我也打电话

[[CCTextureCache sharedTextureCache] addImageFromAnotherThreadWithName:@"" target:nil selector:nil];

直接,项目编译得很好,因为我包含了扩展头文件,但是当我加载 CCBigImage 时发生了同样的异常。

4

1 回答 1

2

包含 Objective-C 类别的静态库必须与 iOS 应用程序强制链接(Mac 应用程序没有此问题),否则无法解析类别方法并出现您描述的错误。更多信息在这里。

不推荐使用 -all_load 标志,尤其是在 Kobold2D 中。这会盲目地将所有可用代码链接到应用程序,即使是您未在应用程序中使用的代码。它基本上使链接器变得盲目和愚蠢,并且应用程序的大小可能会增长几兆字节。

我会在以后的 Kobold2D 版本中添加 cocos2d 扩展的 force-link。现在修复是FrameworksAndLibraries.xcconfig在 Xcode 中的 BuildSettings 组的 Kobold2D-Libraries 项目中编辑文件。

找到强制加载框架/库的部分:

LINK_WITH_ADMOB = $(KKLIBROOT)/GoogleAdMobAdsSDK/libGoogleAdMobAds.a
FORCE_LOAD_COCOS2D = -force_load "$(BUILT_PRODUCTS_DIR)/libcocos2d-ios.a"
FORCE_LOAD_KOBOLD2D = -force_load "$(BUILT_PRODUCTS_DIR)/libkobold2d-ios.a"
FORCE_LOAD_KOBOLDSCRIPT = -force_load "$(BUILT_PRODUCTS_DIR)/libkoboldscript-ios.a"
FORCE_LOAD_KOBOLDSCRIPTWRAPPER = -force_load "$(BUILT_PRODUCTS_DIR)/libkoboldscriptwrapper-ios.a"
FORCE_LOAD_ISIMULATE = -force_load "$(KKLIBROOT)/iSimulateSDK/libisimulate-4.x-opengl.a"
FORCE_LOAD_COCOS3D = -force_load "$(BUILT_PRODUCTS_DIR)/libcocos3d-ios.a"

KKFW_IOS = $(KKFW_SysConfig) $(KKFW_AVFoundation) $(KKFW_CoreGraphics) $(KKFW_CoreLocation) $(KKFW_MediaPlayer) $(KKFW_OpenGLES) $(LINK_WITH_ADMOB) $(FORCE_LOAD_KOBOLD2D) $(FORCE_LOAD_KOBOLDSCRIPT) $(FORCE_LOAD_KOBOLDSCRIPTWRAPPER) $(FORCE_LOAD_COCOS2D) 

现在在 "KKFW_IOS = ..." 行之前添加另一个 FORCE_LOAD_... 条目以 -force_load cocos2d-extensions 库(这都在一行中,我只是添加了换行符以提高可读性):

FORCE_LOAD_COCOS2D_EXTENSIONS = 
           -force_load "$(BUILT_PRODUCTS_DIR)/libcocos2d-extensions-ios.a"

然后在“KKFW_IOS = ...”行的末尾附加这个新的 FORCE_LOAD_COCOS2D_EXTENSIONS 条目(为便于阅读而缩写):

KKFW_IOS = $(KKFW_SysConfig) … $(FORCE_LOAD_COCOS2D_EXTENSIONS)

这应该可以解决问题,您现在应该能够使用 CCBigImage 类别方法。

于 2012-06-23T10:18:10.590 回答