Objective c 单身人士短电话

Objective c 单身人士短电话,objective-c,design-patterns,singleton,dry,Objective C,Design Patterns,Singleton,Dry,使用工作代码进行更新。问题就像@HotLinks state,我做了init而不是initWithBaseURL:url 我在我的应用程序中使用了一个基于的单例 现在,每次我使用singleton时,我都会这样做: 有没有一种方法可以使用简短的语法,特别是当我必须多次使用单例时?类似于: 我已经尝试过这种方法,但没有成功,因为没有调用init方法 WebApi.h #导入“AFHTTPRequestOperationManager.h” #导入“SingletonClass.h” @接口We

使用工作代码进行更新。问题就像@HotLinks state,我做了
init
而不是
initWithBaseURL:url

我在我的应用程序中使用了一个基于的
单例

现在,每次我使用singleton时,我都会这样做:

有没有一种方法可以使用简短的语法,特别是当我必须多次使用
单例时?类似于:

我已经尝试过这种方法,但没有成功,因为没有调用init方法

WebApi.h
#导入“AFHTTPRequestOperationManager.h”
#导入“SingletonClass.h”
@接口WebApi:AFHTTPRequestOperationManager
@性质(非原子,强)单原子类*sc;
+(WebApi*)共享状态;
-(空)沙箱;
@结束
WebApi.m(使用工作代码更新)
#导入“WebApi.h”
@WebApi的实现
//-(WebApi*)初始化{
-(WebApi*)initWithBaseURL:url{
self=[super init];
if(self!=nil){
self.sc=[SingletonClass sharedInstance];//从未被调用。
}
回归自我;
}
#pragma-mark-Singleton方法
/**
*单例方法
*/
+(WebApi*)共享状态
{
静态WebApi*sharedInstance=nil;
静态调度一次预测;
一次发送(一次预测)^{
sharedInstance=[[self alloc]initWithBaseURL:[NSURL URLWithString:kApiHost]];
});        
返回共享状态;
}
-(空)沙箱{
DLog(@“测试短单例调用:%@,[sc callAMethod];
}
@结束
调试消息 [WebApi沙盒][第42行]测试短单例调用:(null)


您可以这样做:

在.h文件中

@interface WebApi : AFHTTPRequestOperationManager

@property (nonatomic, strong) SingletonClass *sc;
...
+(id) methodName;
...
@end
在.m文件中

+(id) methodName
{
    return [[WebApi shareInstance] instanceMethod];
}

- (id) instanceMethod
{
     return @"SMTH";
}

我看不出用任何语言都可以做到这一点。在Java中,您通常会看到

<Class>.getInstance().<blah>.
然后是一大堆:

[api <method1>];
...

如您所见,他们正在生成一个局部变量,然后在控制器类中从那里开始篡改它。

您可以声明一个全局变量,并在
+sharedInstance
方法中设置它,然后确保调用
+sharedInstance
一次

但是,真的不用麻烦了。使用
[SomeClass sharedInstance]
可以很容易地量化代码库中共享实例的所有使用,以及
SomeClass
的类级API的所有使用。这两种方法对于最终维护您的代码的任何其他人都非常有用

第二,它并没有真正节省那么多的打字时间。这还不足以证明要求每个人都了解一个新的全球应用程序是合理的


(罗布说的话):

最后,如果在一个范围内重复调用共享实例上的实例方法,只需使用局部变量:

ThingManager *thingManager = [ThingManager sharedInstance];
[thingManager foo];
[thingManager bar];
[thingManager baz];

您当然可以为您的singleton类创建一个“class”(“+”)方法,该方法获取singleton指针,然后级联到实例方法
@HotLicks我经常认识到init方法没有被调用的地方——至少是断点没有被调用的地方,是被放在init方法上的地方。这对我来说总是很奇怪,但我永远也不知道为什么。是的,我在另一个单例类中调用它。你可以使用上面的代码,只在客户端类中使用,而不是在单例类中使用leton类。上面的代码不起作用,因为您的init方法从未被调用,而且,如果您将其命名正确,您将在设置单例指针之前访问它。
init
未被调用,因为您正在调用
initWithBaseURL
。这样做比我的帖子中的解决方案有优势吗?
WebApi *api = [WebApi sharedInstance];
[api <method1>];
...
CMMotionManager *mManager = [(APLAppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];
ThingManager *thingManager = [ThingManager sharedInstance];
[thingManager foo];
[thingManager bar];
[thingManager baz];