使用工作代码进行更新。问题就像@HotLinks状态,我做init
而不是initWithBaseURL:url
我在我的应用中使用Singleton
,基于this guide。
现在每次使用单身人士时,我都喜欢这样:
SingletonClass* sharedSingleton = [SingletonClass sharedInstance];
[sharedSingleton callAMethod];
// or
[[SingletonClass sharedInstance] callAMethod];
有没有办法使用简短的语法,特别是如果我必须多次使用Singleton
?类似于:
[sc callAMethod];
我已经尝试过这种方法了,但它没有用,因为没有调用init方法......
#import "AFHTTPRequestOperationManager.h"
#import "SingletonClass.h"
@interface WebApi : AFHTTPRequestOperationManager
@property (nonatomic, strong) SingletonClass *sc;
+(WebApi*)sharedInstance;
-(void)sandbox;
@end
#import "WebApi.h"
@implementation WebApi
//-(WebApi*)init {
-(WebApi*)initWithBaseURL:url {
self = [super init];
if (self != nil) {
self.sc = [SingletonClass sharedInstance]; // is never called.
}
return self;
}
#pragma mark - Singleton methods
/**
* Singleton methods
*/
+(WebApi*)sharedInstance
{
static WebApi *sharedInstance = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithString:kApiHost]];
});
return sharedInstance;
}
-(void)sandbox {
DLog(@"test short singleton call: %@", [sc callAMethod];
}
@end
[WebApi沙箱] [第42行]测试短单例调用:(null)
答案 0 :(得分:1)
我不知道你怎么能用任何语言做到这一点。在Java中,您通常会看到
<Class>.getInstance().<blah>.
没有什么能阻止你将这个实例放入一个会被大量使用的方法中,例如。
WebApi *api = [WebApi sharedInstance];
然后很多:
[api <method1>];
...
那会让你到那儿吗?
(有趣的是,开发人员和我昨天正在讨论这个问题,因为Apple使用加速度计的示例代码将运动管理器放入应用程序委托中,并且掌握管理器的语法完全是疯了:
CMMotionManager *mManager = [(APLAppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];
正如你所看到的,他们正在制作一个局部变量,然后在控制器类中从那里开始。
答案 1 :(得分:1)
您可以声明一个全局变量并在+sharedInstance
方法中进行设置,然后确保拨打+sharedInstance
一次。
但是,真的,不要打扰。使用[SomeClass sharedInstance]
可以轻松量化代码库中共享实例的所有用法,以及SomeClass
类级API的所有用法。对于最终维护代码的其他人来说,两者都非常有用。
其次,它并没有真正保存 多次输入。不足以证明要求每个人都了解新的全球。
(Rob说的):
最后,如果要在作用域中重复调用共享实例上的实例方法,只需使用局部变量:
ThingManager *thingManager = [ThingManager sharedInstance];
[thingManager foo];
[thingManager bar];
[thingManager baz];
答案 2 :(得分:0)
你可以这样做:
在.h文件中
@interface WebApi : AFHTTPRequestOperationManager
@property (nonatomic, strong) SingletonClass *sc;
...
+(id) methodName;
...
@end
在.m文件中
+(id) methodName
{
return [[WebApi shareInstance] instanceMethod];
}
- (id) instanceMethod
{
return @"SMTH";
}