//
// 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秒左右