单例,函数的三种调用方式

简介: 单例,函数的三种调用方式

函数的调用方式有三种:

第一种:通过self来调用本对象的成员函数

- (IBAction)captureOrderButtonPressed:(UIButton *)sender

{

[self checkUserStateWithSender:sender];

}

第二种:通过类名调用静态全局函数

MBProgressHUD.h

+(void)hudShowWithStatus :(id)viewcontroller : (NSString *)string;//显示1.8消失的提示框

MBProgressHUD.m

+(void)hudShowWithStatus :(id)viewcontroller :(NSString *)string

{

[MBProgressHUD hudShowWithStatus:viewcontroller :string intervl:1.8];

}

调用处:

[MBProgressHUD hudShowWithStatus:self :[error localizedDescription]];

第三种:通过单例对象来调用单例的函数。

API.h

+ (instancetype)shareAPI;

- (void)updateLocationParams:(NSDictionary *)params block:(void(^)(NSError *error))block;//更新地理位置

API.m

- (void)updateLocationParams:(NSDictionary )params block:(void (^)(NSError ))block

{

NSMutableDictionary *muParams = [NSMutableDictionary dictionaryWithDictionary:params];

[muParams setObject:g_updateLocationCmd forKey:@”cmdCode”];

[self GET:@”resetLngLatJsonPhone.htm” params:muParams success:^(AFHTTPRequestOperation *operation, id responseObject) {

if (responseObject) {

FLDDLogDebug(@”success”);

if (block) {

block(nil);

}

}

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

FLDDLogInfo(@”error”);

if (block) {

block(error);

}

}];

}

调用:

[[API shareAPI] updateLocationParams:muParams block:^(NSError *error) {

g_updatingLocation = NO;

if (!error) {

FLDDLogDebug(@”updata location success”);

g_loginStat = LOGIN_STATE_LOGIN_SUCESS;

if (self.segmentedControl.selectedSegmentIndex == 0)

{

[self setupRefresh];

}

else

{

[self getOrders];

}

// [self getOrders];

[self showNoticeView];

// [self setupRefresh];

}

else

{

g_loginStat = LOGIN_STATE_UNLOCATION_LOGIN;

}

[self showNoticeView];

}];

+ (instancetype)shareAPI
{
    static API *shareAPI = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

#ifdef DEBUG
        NSString *baseUrl = [AppManager valueForKey:@"RootUrl"];

        if (baseUrl.length == 0) {
            baseUrl = @"http://test.zuixiandao.cn/fhl/phone/psy/";
            [AppManager setUserDefaultsValue:baseUrl key:@"RootUrl"];
        }

        shareAPI = [[API alloc] initWithBaseURL:[NSURL URLWithString:baseUrl]];

#else
        shareAPI = [[API alloc] initWithBaseURL:[NSURL URLWithString:BaseURL]];

#endif

    });
    shareAPI.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];//设置相应内容类型
    shareAPI.securityPolicy.allowInvalidCertificates = NO;

    [shareAPI.requestSerializer setTimeoutInterval:g_requeRespondTime];
    return shareAPI;
}

单例又称单子,保证系统的在调用中只生成一个对象,所以若把全局变量存在单例里面就能在通过这个单例访问这些全局变量了。所以IOS的APP几乎都用全局变量,也可以实现部分全局函数代替部分静态全局函数。

通过以下几行代码就能实现单例,简单吧:

+(Singleton *) sharedInstance

{

static Singleton *sharedInstace = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

    sharedInstace = [[self alloc] init];
});

return sharedInstace;

}


若你对C/C++念念不忘也可以用.h文件定义全局变量,在.m文件里包含全局变量头文件就可以,注意在.mm文件里不能用包含全局变量的头文件的方式引用全局变量,需要用extern 声明你需要用到全局变量。一个变量可以有多个声明,只允许一个定义。

extern NSString *g_deviceType;


目录
相关文章
|
2月前
|
设计模式 前端开发 安全
Qt注册类对象单例与单类型区别
在进行开发时,应当根据具体的应用场景和需求来选择使用单例模式或是单类型。如果是全局服务或状态管理,可能需要单例模式;如果是为了使QML环境下的不同组件能够访问到同一个后端服务对象,则可能需要使用单类型。
35 2
|
6月前
|
编译器 数据安全/隐私保护 C++
【类与对象】封装&对象的初始化及清理
【类与对象】封装&对象的初始化及清理
|
6月前
|
C++
c++将一个类的回调函数注入到另一个类中的方法
c++将一个类的回调函数注入到另一个类中的方法
|
6月前
将生命周期方法添加到类中
将生命周期方法添加到类中
|
设计模式
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
单子设计模式 (对创建初始对象为静态,构造函数私有,返回值为对象的创建函数,private应用)
|
C++
同样一句代码,在类内调用,跟类外调用结果不同?
同样一句代码,在类内调用,跟类外调用结果不同?
78 0
|
安全 Java
注解和反射12.动态创建对象执行方法
注解和反射12.动态创建对象执行方法
C# 创建单例你会几种方式?
关于为什么需要创建单例?这里不过多介绍,具体百度知。 关于C# 创建单例步骤或条件吧 1、声明静态变量;2、私有构造函数(无法实例化)3、静态创建实例的方法;至于我这里的Singleton是sealed ,只是为了防止被继承,其实有私有构造函数足够了,这里只是为了代码可读性。
198 0
java反射构建对象和方法的反射调用
java反射构建对象和方法的反射调用Java反射技术应用广泛,其能够配置:类的全限定名,方法和参数,完成对象的初始化,设置是反射某些方法。可以增强java的可配置性。 1.1 通过反射构建对象(无参数):   例如我们使用 ReflectServiceImpl 类讲解这个例子 1 public class ReflectServiceImpl {2 public void sayHello(String name){3 System.out.println("hello"+name);4 }5 }我们通过反射的方法去构建它。
868 0