单例模式的特点:(1)只有一个对象(2)相当于一个全局变量 (3)可以多个对象使用(相当于多个指针指向了这一个对象)
单例模式的优点: 1.实例控制:会阻止其他对象实例化自己的单例对象的副本,从而确保所有对象都访问唯一实例
2.灵活性:因为类控制了实例化过程,所以类可以更灵活更改实例化过程
单例模式的缺点: 一:开销
每次对象请求引用的时候都要检查一次是否存在类的实例,会增加内存,可以通过静态初始化的方法来解决
二:可能的开发混淆
使用单例对象的时候 ,不能以new关键字实例化对象 使用new关键字无法实例化这个类
三:对象生存期
无会被轻易释放,要谨慎使用!
实现:
(1)创建一个类(2)在实现文件证明一个全局变量(3)封装一个实例化单例对象的方法,这是以一个类方法,判断全局变量是否为空最终保证对象性的唯一性(4)接口文件中声明封装的方法(5)引入特殊类的头文件(6)通过封装的实例化单例对象的方法实例化出对象。
单例对象:(1)可以有多个指针指向(2)单例对象可以传值
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Theme.h"
#import "Moblie.h"
int main(int argc, const char * argv[]) {
// insert code here...
NSLog(@"Hello, World!");
//一般对象实例化的过程
Person *newPerson=[[Person alloc]init];
//利用了我们自己封装的方法实例化的对象,这时的对象叫单例对象
Person *person=[Person sharePerson];
//利用了我们自己封装的方法实例化的对象,这时的对象叫单例对象
Person *personI=[Person sharePerson];
//利用了我们自己封装的方法实例化的对象,这时的对象叫单例对象
Person *personII=[Person sharePersonI];
// 对一个单例对象进行属性赋值
personII.name=@"xiaoMing";
personII.age=10;
Person *personIII=[Person sharePersonI];
// 虽然换一个指针仍是之前的对象,修改属性值后两个指针找到的属性都会改变
personIII.name=@"xiaoXiaoMing";
NSLog(@"personII name:%@ personII age :%i personIII name:%@ personIII age :%i",personII.name,personII.age,personIII.name,personIII.age);
// NSLog(@"newPerson:%p person:%p personI:%p",newPerson,person,personI);
NSLog(@"newPerson:%p personII:%p personIII:%p",newPerson,personII,personIII);
Theme *theme=[[Theme alloc]init];
NSMutableArray *muArray=[[NSMutableArray alloc]initWithCapacity:10];
[muArray addObjectsFromArray:@[@"浅蓝",@"灰色"]];
NSLog(@"%@",muArray[0]);
theme.color=muArray;
Moblie *phone=[[Moblie alloc]init];
// 通过单例传值
phone.moblieColor=theme.color[0];
NSLog(@"手机的主题颜色:%@",phone.moblieColor);
NSArray *array=@[@"1",@"11",@"14",@"2"];
NSComparisonResult (^sort)( id ,id ) = ^( id object1 , id object2 ){0
return [object1 compare:object2];
};
// NSArray *sortArray=[array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
// return [obj1 compare:obj2];
// }];
NSArray *arratS=[array sortedArrayUsingComparator:sort];
NSLog(@"%@",arratS);
[person setBlock:^(NSString *name) {
person.name=name;
}];
person.blockTest(@"jack");
NSLog(@"person name:%@",person.name);
//-------复习代码块
__block int q=9;
//无返回无参数的代码块;
void (^my_block)(void);//声明
my_block=^(void){
q=q-6;
};//定义
my_block();//调用
NSLog(@"%i",q);
//有返回值有参数的
int (^block)( double , double ) = ^(double num1, double num2){
return (int)num1 + (int)num2;
};
NSLog(@"%i", block(2,4));
//构造块:
typedef int (^add_block) (int,int);
add_block addMethod=^(int num , int num1){
return num1+num;
};
int sum=addMethod(2,3);
NSLog(@"%i",sum);
//静态块,在递归调用时使用
static int (^blockI) ( void )=^{
return 1;
};
//-------设计模式--(单例模式)
// 特点:(1)只有一个对象(2)相当于一个全局变量 (3)多个对象使用
// 实现:
// (1)创建一个类(2)在实现文件证明一个全局变量(3)封装一个实例化单例对象的方法,这是以一个类方法,判断全局变量是否为空最终保证对象性的唯一性(4)接口文件中声明封装的方法(5)引入特殊类的头文件(6)通过封装的实例化单例对象的方法实例化出对象。
// 单例对象:(1)可以有多个指针指向(2)单例对象可以传值
// 注意:单例对象不会轻易被释放,谨慎使用
//代码块练习:字符串编码:利用代码块将字符串@“apple”变化为@“abpqpqlmef”
// 单例练习:建立Son类,有属性motherName和fatherName,单例传值给父亲对象和母亲你、对象
}
return 0;
}
//
// Theme.h
// 单例模式
//
// Created by 非凡 程序员 on 15/11/4.
// Copyright (c) 2015年 非凡 程序员. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Theme : NSObject
@property(nonatomic,strong)NSMutableArray *color;
+(id)shareTheme;
@end
//
// Moblie.h
// 单例模式
//
// Created by 非凡 程序员 on 15/11/4.
// Copyright (c) 2015年 非凡 程序员. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Moblie : NSObject
@property(nonatomic,strong)NSString *moblieColor;
@end
//
// Moblie.m
// 单例模式
//
// Created by 非凡 程序员 on 15/11/4.
// Copyright (c) 2015年 非凡 程序员. All rights reserved.
//
#import "Moblie.h"
@implementation Moblie
@end
//
// Theme.m
// 单例模式
//
// Created by 非凡 程序员 on 15/11/4.
// Copyright (c) 2015年 非凡 程序员. All rights reserved.
//
#import "Theme.h"
@implementation Theme
static id themeObject;
+(id)shareTheme{
if (themeObject==nil) {
themeObject=[[self alloc]init];
}
return themeObject;
}
@end
//
// Person.h
// 单例模式
//
// Created by 非凡 程序员 on 15/11/4.
// Copyright (c) 2015年 非凡 程序员. All rights reserved.
//
#import <Foundation/Foundation.h>
typedef void (^Block)(NSString *);
@interface Person : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,assign)int age;
@property(nonatomic,strong)Block blockTest;
-(void)setBlock:(Block)block;
//定义实例化单例对象的方法一:以Person类指针作为返回值
+ ( Person * ) sharePersonI ;
//定义实例化单例对象的方法二:以id类型(对象类型)作为返回值,这里的id类型指Person类的对象
+ ( id ) sharePerson ;
@end
//
// Person.m
// 单例模式
//
// Created by 非凡 程序员 on 15/11/4.
// Copyright (c) 2015年 非凡 程序员. All rights reserved.
//
#import "Person.h"
@implementation Person
//先定义全局变量
static Person *person=nil;
//以Person类指针作为返回值实现实例化单例对象的方法
+(Person *)sharePersonI{
// 判断指针指向的地址为空
if (person==nil) {
// 如果指针没有指向有效的内存地址,就需要实例化对象
person=[[self alloc]init];
}
// 返回新实例化的对象(当没有对象时)或者已有的对象
return person;
}
//先定义全局变量
static id singlePerson;
//:以id类型(对象类型)作为返回值,这里的id类型指Person类的对象定义实例化单例对象的方法
+(id)sharePerson{
// 判断指针指向的地址为空
if (singlePerson==nil) {
// 如果指针没有指向有效的内存地址,就需要实例化对象
singlePerson=[[self alloc]init];
}
// 返回新实例化的对象(当没有对象时)或者已有的对象
return singlePerson;
}
-(void)setBlock:(Block)block{
self.blockTest=block;
}
//检查对象是否被释放。将检查发现单例对象没有被释放
-(void)dealloc{
NSLog(@"person 释放");
}
@end