object c 单例模式

//
//  main.m
//  SingleInstanceDemo
//
//  Created by 千雅爸爸 on 16/10/7.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "User.h"
#import "LoginView.h"
#import "SettingView.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //单例设计模式:
        //用户的信息可以使用单例设计模式
        User *user = [User sharedUser];
        NSLog(@"%p",user);
        
        User *user2 = [User sharedUser];
         NSLog(@"%p",user2);
        
        LoginView *loginView =[[LoginView alloc]init];
        SettingView *settingView = [[SettingView alloc]init];
        
        [loginView login];
        [settingView about];
        
    }
    return 0;
}


//
//  User.h
//  SingleInstanceDemo
//
//  Created by 千雅爸爸 on 16/10/7.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface User : NSObject

//一般是以default或者是shared开头
+(instancetype)sharedUser;

@property (nonatomic,copy) NSString *username;
@property (nonatomic,assign) NSInteger age;


@end


//
//  User.m
//  SingleInstanceDemo
//
//  Created by 千雅爸爸 on 16/10/7.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#import "User.h"

@implementation User
//全局可见的
static User *user = nil;

//一般是以default或者是shared开头
+(instancetype)sharedUser{
    //判断有没有对象实例,如果有了,那么就不去创建了
    //if(!user){
    //    user = [[self alloc]init];
    //}
    //如果考虑到多线程和同步的问题。有两种方法
    //1:互斥锁(比较消耗资源)
    //2:jcd的方式
    
    //互斥锁和java中的差不多,jcd java中没有
    
    //1:互斥锁
    //@synchronized (self) {
    //    if(!user){
    //        user = [[self alloc]init];
    //    }
    //}
    
    //2.jcd
    static dispatch_once_t onceToken;//是否只能执行一次
    dispatch_once(&onceToken, ^{
            if(!user){
                user = [[self alloc]init];
            }
    });
    
    
    return user;
}

//如果用户非要用alloc init 去创建的话
+(instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;//是否只能执行一次
    dispatch_once(&onceToken, ^{
        if(!user){
            user = [super allocWithZone:zone];
        }
    });
    return user;
}

//copy 直接返回就好了
-(id)copy{
    return user;
}
//mutableCopy也直接返回就好了
-(id)mutableCopy{
    return user;
}


- (NSString *)description
{
    return [NSString stringWithFormat:@"username=%@,age=%d", _username,_age];
}
@end



//
//  LoginView.h
//  SingleInstanceDemo
//
//  Created by 千雅爸爸 on 16/10/7.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface LoginView : NSObject

-(void)login;
@end

//
//  LoginView.m
//  SingleInstanceDemo
//
//  Created by 千雅爸爸 on 16/10/7.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#import "LoginView.h"
#import "User.h"
@implementation LoginView

-(void)login{
    User *user = [User sharedUser];
    user.username = @"tome";
    user.age = 20;
}
@end

//
//  SettingView.h
//  SingleInstanceDemo
//
//  Created by 千雅爸爸 on 16/10/7.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface SettingView : NSObject

-(void)about;

@end


//
//  SettingView.m
//  SingleInstanceDemo
//
//  Created by 千雅爸爸 on 16/10/7.
//  Copyright © 2016年 kodulf. All rights reserved.
//

#import "SettingView.h"
#import "User.h"

@implementation SettingView
-(void)about{
    User *user = [User sharedUser];
    NSLog(@"%@",user);
}
@end



http://blog.csdn.net/rodulf/article/details/52750955


5.GCD与block

说白了就是在iOS中有一些下载是需要放在后台来做的,这时候就需要异步,而GCD就是用于做异步的

 

一般移动平台上系统都会有一个专门的检查机制,看程序有没有很长时间被阻塞住,没有回来检查主消息队列。发现这种情况一般都是把程序作为“无响应”干掉。iOS一般情况下是10秒为上限。10秒内程序没有回到主消息循环就被干掉。在前台后台切换时更严格,大概是5秒左右

 

[objc]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. // 用户点击了按纽,触发计算操作  
  2.     - (void) didTapCalcButton {  
  3.         // 显示“请等待”提示  
  4.         [self showWaitingView];  
  5.          
  6.         // 以下两行将任务排程到一个后台线程执行。dispatch_get_global_queue会取得一个系统分配的后台任务队列。  
  7.         dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  8.         dispatch_async(queue, ^{  
  9.              
  10.             // 计算PI值到100万位。和示例1的calcPI:完全一样,唯一区别是现在它在后台线程上执行了。  
  11.             NSString *result = [self calcPI:1000000];  
  12.              
  13.             // 计算完成后,因为有UI操作,所以需要切换回主线程。一般原则:  
  14.             // 1. UI操作必须在主线程上完成。2. 耗时的同步网络、同步IO、运算等操作不要在主线程上跑,以避免阻塞  
  15.             // dispatch_get_main_queue()会返回关联到主线程的那个任务队列。  
  16.             dispatch_async(dispatch_get_main_queue(), ^{  
  17.                  
  18.                 // 关闭“请等待”提示  
  19.                 [self hideWaitingView];  
  20.                  
  21.                 // 显示结果  
  22.                 [self displayResult:result];      
  23.             });  
  24.         });  
  25.     }  
  26.    





5.GCD与block

说白了就是在iOS中有一些下载是需要放在后台来做的,这时候就需要异步,而GCD就是用于做异步的

 

一般移动平台上系统都会有一个专门的检查机制,看程序有没有很长时间被阻塞住,没有回来检查主消息队列。发现这种情况一般都是把程序作为“无响应”干掉。iOS一般情况下是10秒为上限。10秒内程序没有回到主消息循环就被干掉。在前台后台切换时更严格,大概是5秒左右

 

[objc]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. // 用户点击了按纽,触发计算操作  
  2.     - (void) didTapCalcButton {  
  3.         // 显示“请等待”提示  
  4.         [self showWaitingView];  
  5.          
  6.         // 以下两行将任务排程到一个后台线程执行。dispatch_get_global_queue会取得一个系统分配的后台任务队列。  
  7.         dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  8.         dispatch_async(queue, ^{  
  9.              
  10.             // 计算PI值到100万位。和示例1的calcPI:完全一样,唯一区别是现在它在后台线程上执行了。  
  11.             NSString *result = [self calcPI:1000000];  
  12.              
  13.             // 计算完成后,因为有UI操作,所以需要切换回主线程。一般原则:  
  14.             // 1. UI操作必须在主线程上完成。2. 耗时的同步网络、同步IO、运算等操作不要在主线程上跑,以避免阻塞  
  15.             // dispatch_get_main_queue()会返回关联到主线程的那个任务队列。  
  16.             dispatch_async(dispatch_get_main_queue(), ^{  
  17.                  
  18.                 // 关闭“请等待”提示  
  19.                 [self hideWaitingView];  
  20.                  
  21.                 // 显示结果  
  22.                 [self displayResult:result];      
  23.             });  
  24.         });  
  25.     }  
  26.    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值