gpt4 book ai didi

objective-c - 在 Cocos2d 中没有调用单例方法

转载 作者:行者123 更新时间:2023-11-28 20:41:52 24 4
gpt4 key购买 nike

我正在调用一个 Singleton 方法,当我尝试这样做时它没有被调用。我没有收到任何错误或任何信息,只是我看不到 CCLOG 消息。

在什么情况下编译器不会给你报错并且不允许你调用方法?

[[GameManager sharedGameManager] openSiteWithLinkType:kLinkTypeDeveloperSite];

方法定义如下:

-(void)openSiteWithLinkType:(LinkTypes)linkTypeToOpen
{

CCLOG(@"WE ARE IN openSiteWithLinkType"); //I NEVER SEE THIS MESSAGE

NSURL *urlToOpen = nil;

if (linkTypeToOpen == kLinkTypeDeveloperSite)
{
urlToOpen = [NSURL URLWithString:@"http://somesite.com"];
}

if (![[UIApplication sharedApplication]openURL:urlToOpen])
{
CCLOG(@"%@%@",@"Failed to open url:",[urlToOpen description]);
[self runSceneWithID:kMainMenuScene];
}

}

这是我的单例的代码:

#import "GameManager.h"
#import "MainMenuScene.h"


@implementation GameManager
static GameManager* _sharedGameManager = nil;
@synthesize isMusicON;
@synthesize isSoundEffectsON;
@synthesize hasPlayerDied;

+(GameManager*) sharedGameManager
{
@synchronized([GameManager class])
{

if (!_sharedGameManager)
{
[[self alloc] init];
return _sharedGameManager;
}
return nil;
}

}


+(id)alloc
{

@synchronized ([GameManager class])
{
NSAssert(_sharedGameManager == nil,@"Attempted to allocate a second instance of the Game Manager singleton");
_sharedGameManager = [super alloc];
return _sharedGameManager;
}
return nil;
}

-(id)init
{
self = [super init];
if (self != nil)
{
//Game Manager initialized
CCLOG(@"Game Manager Singleton, init");
isMusicON = YES;
isSoundEffectsON = YES;
hasPlayerDied = NO;
currentScene = kNoSceneUninitialized;
}

return self;

}


-(void) runSceneWithID:(SceneTypes)sceneID
{
SceneTypes oldScene = currentScene;
currentScene = sceneID;
id sceneToRun = nil;


switch (sceneID)
{
case kMainMenuScene:
sceneToRun = [MainMenuScene node];
break;

default:
CCLOG(@"Unknown Scene ID, cannot switch scenes");
return;
break;
}

if (sceneToRun == nil)
{

//Revert back, since no new scene was found
currentScene = oldScene;
return;
}




//Menu Scenes have a value of < 100
if (sceneID < 100)
{
if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad)
{
CGSize screenSize = [CCDirector sharedDirector].winSizeInPixels;
if (screenSize.width == 960.0f)
{
//iPhone 4 retina
[sceneToRun setScaleX:0.9375f];
[sceneToRun setScaleY:0.8333f];
CCLOG(@"GM: Scaling for iPhone 4 (retina)");
}
else
{
[sceneToRun setScaleX:0.4688f];
[sceneToRun setScaleY:0.4166f];
CCLOG(@"GM: Scaling for iPhone 3G or older (non-retina)");
}

}

}


if ([[CCDirector sharedDirector] runningScene] == nil)
{
[[CCDirector sharedDirector] runWithScene:sceneToRun];
}
else

{
[[CCDirector sharedDirector] replaceScene:sceneToRun];

}

}


-(void)openSiteWithLinkType:(LinkTypes)linkTypeToOpen
{

CCLOG(@"WE ARE IN openSiteWithLinkType");

NSURL *urlToOpen = nil;

if (linkTypeToOpen == kLinkTypeDeveloperSite)
{
urlToOpen = [NSURL URLWithString:@"http://somesite.com"];
}

if (![[UIApplication sharedApplication]openURL:urlToOpen])
{
CCLOG(@"%@%@",@"Failed to open url:",[urlToOpen description]);
[self runSceneWithID:kMainMenuScene];
}

}


-(void) test
{


CCLOG(@"this is test");

}
@end

最佳答案

也许 sharedGameManager 正在返回 nil?这不会导致错误。

编辑:问题出在您发布的新代码中:

if (!_sharedGameManager) {
[[self alloc] init];
return _sharedGameManager;
}
return nil;

如果 _sharedGameManager 不是 nil,这将返回 nil。你想要:

if (!_sharedGameManager) {
[[self alloc] init];
}
return _sharedGameManager;

关于objective-c - 在 Cocos2d 中没有调用单例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8195883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com