Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C-修改单例对象的类别?_Objective C_Unit Testing_Singleton_Categories - Fatal编程技术网

Objective c 目标C-修改单例对象的类别?

Objective c 目标C-修改单例对象的类别?,objective-c,unit-testing,singleton,categories,Objective C,Unit Testing,Singleton,Categories,我知道singleton的全部目的是实例化onject的一个实例并重用它,但是当涉及到单元测试时,我希望能够在每次测试之前更新singleton对象 我试图使用一个类别来访问singleton对象并将其发布,但类别无法访问它。知道实现这一点的最佳方法吗 @implementation SingletonClass static SingletonClass *singleton; + (SingletonClass*)sharedInstance { if (!singleton)

我知道singleton的全部目的是实例化onject的一个实例并重用它,但是当涉及到单元测试时,我希望能够在每次测试之前更新singleton对象

我试图使用一个类别来访问singleton对象并将其发布,但类别无法访问它。知道实现这一点的最佳方法吗

@implementation SingletonClass

static SingletonClass *singleton;

+ (SingletonClass*)sharedInstance
{
   if (!singleton)
   {
      singleton = [[SingletonClass alloc] init];
   }
   return singleton;
}

@end


我不确定这是否有效,但也许您可以重写
sharedInstance
类方法,自己管理singleton:

@implementation SingletonClass (Unit Testing Additions)

static SingletonClass *myVeryOwnSharedInstance;

+ (SingletonClass *) sharedInstance
{
    if (!myVeryOwnSharedInstance)
        myVeryOwnSharedInstance = [[self alloc] init];
    return myVeryOwnSharedInstance;
}

+ (void) killInstance
{
    [myVeryOwnSharedInstance release];
    // if release is overridden to do no-op, maybe just invoke -dealloc directly
    myVeryOwnSharedInstance = nil;
}

@end

我不确定这是否有效,但也许您可以重写
sharedInstance
类方法,自己管理singleton:

@implementation SingletonClass (Unit Testing Additions)

static SingletonClass *myVeryOwnSharedInstance;

+ (SingletonClass *) sharedInstance
{
    if (!myVeryOwnSharedInstance)
        myVeryOwnSharedInstance = [[self alloc] init];
    return myVeryOwnSharedInstance;
}

+ (void) killInstance
{
    [myVeryOwnSharedInstance release];
    // if release is overridden to do no-op, maybe just invoke -dealloc directly
    myVeryOwnSharedInstance = nil;
}

@end

如果要在声明的文件之外访问
单例
全局变量,则需要使用
extern
使其全局可访问

SingletonClass.h
的顶部,放置以下内容:

extern SingletonClass *singletonClassSingleton;
SingletonClass.m
中,使用以下命令:

SingletonClass *singletonClassSingleton = nil;
然后假设在单元测试.m文件中有
#import“SingletonClass.h”
,您应该能够添加:

@implementation SingletonClass(Unit Testing Additions)

+ (void)killInstance
{
   [singletonClassSingleton release], singletonClassSingleton = nil;
}

@end

我将
singleton
重命名为
singletonClassSingleton
的原因是该变量现在是全局变量-如果您有一组singleton类,则需要这些变量具有唯一的名称,如
dataManagerSingleton
resourceManagerSingleton
或其他任何内容。

如果要在声明的文件之外访问
singleton
全局变量,需要使用
extern
使其全局可访问

SingletonClass.h
的顶部,放置以下内容:

extern SingletonClass *singletonClassSingleton;
SingletonClass.m
中,使用以下命令:

SingletonClass *singletonClassSingleton = nil;
然后假设在单元测试.m文件中有
#import“SingletonClass.h”
,您应该能够添加:

@implementation SingletonClass(Unit Testing Additions)

+ (void)killInstance
{
   [singletonClassSingleton release], singletonClassSingleton = nil;
}

@end

我将
singleton
重命名为
singletonClassSingleton
的原因是该变量现在是全局变量-如果您有一组singleton类,则需要这些变量具有唯一的名称,如
dataManagerSingleton
resourceManagerSingleton
或其他任何名称。

根据singleton的定义,你不能这样做

如果是你的班级,不要让它成为单身


如果不是你的类,那么这样做就会失败。

根据单例的定义,你不能这样做

如果是你的班级,不要让它成为单身


如果不是你的课,那么这样做会失败。

这是我自己的解决方案

@implementation SingletonClass(Unit Testing Additions)

//Override
static SingletonClass *singleton;

+ (void)killInstance
{
   // I get an error here and I cannot access the singleton Object
   [singleton release], singleton = nil;
}

//Override
+ (SingletonClass*)sharedInstance
{
   if (!singleton)
   {
      singleton = [[SingletonClass alloc] init];
   }
   return singleton;
}

@end

这是我自己的解决办法

@implementation SingletonClass(Unit Testing Additions)

//Override
static SingletonClass *singleton;

+ (void)killInstance
{
   // I get an error here and I cannot access the singleton Object
   [singleton release], singleton = nil;
}

//Override
+ (SingletonClass*)sharedInstance
{
   if (!singleton)
   {
      singleton = [[SingletonClass alloc] init];
   }
   return singleton;
}

@end

只是提醒一下,即使您尝试在self上调用
release
,它也无法按照约定作为单例覆盖
-release
。我想你可以在类别中覆盖
-release
你自己…不要在类名中使用“class”这个词。“当涉及到单元测试时,我希望能够在每次测试之前更新singleton对象。”这是反对singleton的论点之一。这个对象一开始真的需要是一个单例吗?只是提醒一下,即使你自己尝试调用
release
,它也不会像单例覆盖
-release那样按惯例工作。我想你可以在类别中覆盖
-release
你自己…不要在类名中使用“class”这个词。“当涉及到单元测试时,我希望能够在每次测试之前更新singleton对象。”这是反对singleton的论点之一。这个对象首先真的需要是一个单例吗?我认为OP实际上不能更改单例的声明,甚至不能修改原始源代码,否则整个问题都是极其琐碎的(不妨将
+killInstance
方法放入类本身)我认为OP是在问,因为他们想把测试保存在一个单独的文件中,与类本身分开。我看不到OP声明他们没有访问或修改原始源代码的能力?我可以访问该类,我不想将killInstance添加到实际的类中,这太可怕了,而且它违反了单例模式,该类别只属于我的测试目标,所以我只能杀死测试目标中的单例。我不希望任何人能够以任何可能的方式发布或修改我的主要目标中的单例。我认为OP实际上不能更改单例声明,甚至不能修改原始源代码,否则整个问题都是极其琐碎的(不妨将
+killInstance
方法放入类本身)我认为OP是在问,因为他们想把测试保存在一个单独的文件中,与类本身分开。我看不到OP声明他们没有访问或修改原始源代码的能力?我可以访问该类,我不想将killInstance添加到实际的类中,这太可怕了,而且它违反了单例模式,该类别只属于我的测试目标,所以我只能杀死测试目标中的单例。我不希望任何人能够以任何可能的方式发布或修改我的主要目标中的singleton。这与几天前@dreamlax给出的答案完全相同!这与几天前@dreamlax给出的答案完全相同!