我的方法+(void)初始化没有被调用,我在Objective C中是非常新的.代码在iPhone游戏开发的书中,我必须明确地调用该方法才能工作..m文件中的代码是:
ResourceManager *g_ResManager;
@implementation ResourceManager
//initialize is called automatically before the class gets any other message, per from http://stackoverflow.com/questions/145154/what-does-your-objective-c-singleton-look-like
+ (void) initialize
{
static BOOL initialized = NO;
if(!initialized)
{
initialized = YES;
g_ResManager = [[ResourceManager alloc] init];
}
}
...
@end
Run Code Online (Sandbox Code Playgroud)
但是在.h文件中,变量的外部声明是:
extern ResourceManager *g_ResManager; //paul <3's camel caps, hungarian notation, and underscores.
@interface ResourceManager : NSObject {
...
}
...
@end
Run Code Online (Sandbox Code Playgroud)
我尝试了一切(删除外部,在.m声明中放置静态)并始终得到编译错误.上面的代码编译但是从不调用方法initialize(设置断点来查看).
一些线索?
我有tabbar应用程序,在第一个选项卡中我有一个webView,所以当用户打开网站并下载一些歌曲mp3格式时,它会推送另一个View取用用户的标题.
在给出标题后,我只需将tabbarSelectController更改为一个歌曲标题,然后开始下载并显示在所选索引1的标签栏上.当我将标签更改为选定的索引0并选择另一首歌曲进行下载并再次返回到选择索引1时下载停止和第二次下载恢复.
所以我想下载多首歌曲并且不知道如何在这种情况下如何做到这一点,因为用户动态添加歌曲我也见过ASINtworkQueue但是不知道它是如何工作的
我想完成这篇文章中正在做的事情:Objective-C中的常量
但是,我想构建一个NSDictionary.
如果我这样做:
constants.h
extern NSArray *const mFooKeys;
extern NSArray *const mFooObjects;
extern NSDictionary *const mFooDictionary;
Run Code Online (Sandbox Code Playgroud)
constants.m
NSArray *const mFooKeys = [[NSArray alloc] initWithObjects:
@"Foo", @"Bar", @"Baz", nil];
NSArray *const mFooObjects = [[NSArray alloc] initWithObjects:
@"1", @"2", @"3", nil];
NSDictionary *const mFooDictionary = [[NSDictionary alloc] dictionaryWithObjects:mFooObjects
forKeys:mFooKeys];
Run Code Online (Sandbox Code Playgroud)
我是以dealloc发布的,一切都很好,还是有更多的东西?这个问题比一个"有问题"的问题更为谨慎,但我觉得如果没有意识到这一点,我真的可能会把它搞得一团糟.
我是Objective-C的新手,我正在尝试根据Apple的文档创建一个单例类.
+ (MyGizmoClass*)sharedManager
{
if (sharedGizmoManager == nil) {
sharedGizmoManager = [[super allocWithZone:NULL] init];
}
return sharedGizmoManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
return [[self sharedManager] retain];
}
Run Code Online (Sandbox Code Playgroud)
在此代码中sharedManager是一个静态方法,它将检查此类的对象是否存在.如果是这样,它将返回先前创建的对象,否则它将创建一个新对象.
我有一些问题:
如果sharedManager是静态的,它如何访问super?
当我打印[super class]为什么它给出当前的类名?
为什么[[super allocWithZone:NULL] init]返回当前的类对象?
如果super等于self这里,为什么它不调用当前类allocWithZone:(NSZone *)zone?
这是我在研究单身人士文献后所编造的内容.我忘了什么吗?
@implementation MySingleton
static MySingleton *mySharedInstance = nil;
//called by atexit on exit, to ensure all resources are freed properly (not just memory)
static void singleton_remover()
{
//free resources here
}
+ (MySingleton*) sharedInstance{
return mySharedInstance;
}
+ (void)initialize {
if (self == [MySingleton class]) {
mySharedInstance = [[super allocWithZone:NULL] init];
atexit( singleton_remover );
}
}
+ (id)allocWithZone:(NSZone *)zone
{
return [self sharedInstance];
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{ …Run Code Online (Sandbox Code Playgroud) 我正在尝试直接实现一个类,即NSObject在使用它的应用程序运行的整个过程中只能有一个实例可用.
目前我有这种方法:
// MyClass.h
@interface MyClass : NSObject
+(MyClass *) instance;
@end
Run Code Online (Sandbox Code Playgroud)
并实施:
// MyClass.m
// static instance of MyClass
static MyClass *s_instance;
@implementation MyClass
-(id) init
{
[self dealloc];
[NSException raise:@"No instances allowed of type MyClass" format:@"Cannot create instance of MyClass. Use the static instance method instead."];
return nil;
}
-(id) initInstance
{
return [super init];
}
+(MyClass *) instance {
if (s_instance == nil)
{
s_instance = [[DefaultLiteralComparator alloc] initInstance];
}
return s_instance;
}
@end
Run Code Online (Sandbox Code Playgroud)
这是完成这项任务的正确方法吗? …
在阅读了对Objective C中关于单例的问题的回答之后,似乎每个解决方案都在实例访问器中对线程进行了一些权衡.即
@synchronized(self)
{
if (sharedInstance == nil)
sharedInstance = [[MySingleton alloc] init];
}
return sharedInstance;
Run Code Online (Sandbox Code Playgroud)
这基本上是单线程访问单例,如果它是在操作中经常使用的东西,看起来像是可能导致线程不必要地竞争的东西.
简单地使用类对象作为单例实例,并通过类方法公开功能,即
@interface MySingleton : NSObject {
}
+ (void)doSomething;
@end
@implementation MySingleton
+ (void)initialize {
//do some setup if necessary
}
+ (void)doSomething {
//do something
}
@end
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我们避免每次想要引用单例对象时都进行锁定+检查,我们也可以省去将其存储在本地或方法ivar中.
此方法还允许运行时保证在任何给定时间系统中只存在一个实例(Class对象).
编辑
这里除了线程之外还有更多,使用传统的单例,您通常会编写如下代码:
MySingleton *instance = [MySingleton getSharedInstance];
NSObject *someResult = [instance getResult];
//or
if (instance.someProperty) {
//do something
}
Run Code Online (Sandbox Code Playgroud)
但是,如果你的单例是一个类实例,你基本上就不需要一直调用getSharedInstance.考虑以下代码:
NSObject *someResult = [MySingleton getResult];
//or
if ([MySingleton someProperty]) {
//do …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Java代码转换为Objective C代码.并且java代码包含定义为volatile的变量.我在网上查看了java中的"volatile"用法,如下所示
Essentially, volatile is used to indicate that a variable's value will be modified by different threads.
Run Code Online (Sandbox Code Playgroud)
所以,如果我要在Objective C中将变量设置为volatile,因为变量将由不同的线程访问,那么我不需要将这些变量设置为volatile,因为我可以将这些变量设置为atomic?
我有一个带有几个控制器的iOS应用程序,每个控制器都有自己的xib文件.
如何设置一个跨越所有控制器的范围的全局变量?我应该NSUserDefaults每次都为每个视图使用和检索数据吗?
在您看来,如果我使用这样的参数初始化NSObject的单例子类:
- (MyObject *) initWithSomeParam:(NSString *)param{
self = [super init];
if (SharedInstance == nil){
SharedInstance = [super init];
SharedInstance.someProperty = param;
}
return self;
}
+ (MyObject *) objectWithSomeParam:(NSString *)param{
return [[self alloc] initWithSomeParam:param];
// Will the alloc cause a leak?
}
Run Code Online (Sandbox Code Playgroud)
用户无权访问实例方法,只能访问类.谢谢.
objective-c ×9
iphone ×4
ios ×2
singleton ×2
atexit ×1
constants ×1
ios4 ×1
nsdictionary ×1
release ×1