gpt4 book ai didi

objective-c - 单例被释放

转载 作者:行者123 更新时间:2023-11-29 13:27:18 25 4
gpt4 key购买 nike

我创建了一个简单的单例类来保存我的项目的静态数据。我第一次访问这个单例是在我的 Cocos2d 场景中的 onEnter 方法。但是,当我稍后尝试以另一种方法(同一场景)再次访问它时,这个单例已经被释放了。我很困惑,如何防止我的单例被释放?

这是我的单例接口(interface)部分:

#import <Foundation/Foundation.h>

@interface OrchestraData : NSObject
+(OrchestraData *)sharedOrchestraData;
@property (retain, readonly) NSArray *animalNames;
@end

实现:

#import "OrchestraData.h"

@implementation OrchestraData
@synthesize animalNames = animalNames_;

+(OrchestraData*)sharedOrchestraData
{
static dispatch_once_t pred;
static OrchestraData *_sharedOrchestraData = nil;

dispatch_once(&pred, ^{ _sharedOrchestraData = [[OrchestraData alloc] init]; });
return _sharedOrchestraData;
}

-(id)init {
if (self = [super init]) {
animalNames_ = [NSArray arrayWithObjects:@"giraffe", @"giraffe", @"giraffe", @"giraffe", nil];
}
return self;
}
@end

我以这种方式使用我的单例:

[[OrchestraData sharedOrchestraData] animalNames];

更新:我在启用 NSZombies 的情况下重新审视了它,看起来好像我的 NSArrays 被释放了,而不是单例本身。我该怎么办?

最佳答案

您必须以这种方式实现您的单例:

1) 在你的单例类的 .h 文件中:

+ (SingletonClass *)instance;

2) 在 .m 文件中:

+ (SingletonClass *)instance {

static SingletonClass* instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
//your init code here
});
return instance;
}

如果你想调用你的单例,只需调用[SingletonClass instance]

如果您对什么是“dispatch_once_t”感兴趣,请阅读 Grand Central Dispatch: http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

关于objective-c - 单例被释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12802670/

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