Objective c 单身人士短电话
使用工作代码进行更新。问题就像@HotLinks state,我做了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
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];