您好,欢迎来到伴沃教育。
搜索
您的当前位置:首页iOS设计模式

iOS设计模式

来源:伴沃教育

零:设计模式

设计模式:设计模式是为特定场景下的问题定制的解决方案,设计模式分三种类型:创建型,结构型,行为型;
iOS中:
创建型:单例,工厂;
结构型:代理,MVC;
行为型:观察者,策略;

单例:

一:理解

优点:单例的对象,使用静态变量修饰,只创建一次,保证对象的唯一性,而且自行实例化并向整个系统提供这个实例;
优点:
1.节省内存每次获取实例时会先进行判断,实例存在则返回,否则创建实例,如果一直不用,则不会创建实例,从而节省了内内存空间;
2.因为单例类控制实例化过程,所以可以更灵活的修改实例化过程;
缺点:
1.运行费时间上面的判断会浪费一些时间;
2.线程安全问题并发情况下,如果线程A和线程B同时调用某一方法,会创建出两个实例,此时单例模式失效,若想解决线程安全问题,需要加synchronized解决,但会降低访问速度;
3.单例对象在App运行期间一直存在,不被释放,只有在退出App时候才会被系统销毁;
场景:
1.如果创建某一个对象会耗费很多系统资源,此时采取单例模式,因为只需要一个实例,会节省alloc时间
2.若很多模块需要使用同一变量,可以将它放入单例类

二:创建

2.1.使用GCD中的dispatch_once_t

//GCD创建单例
+ (Singleton *)share {
//    创建静态变量先赋值为nil
    static Singleton *singleton = nil;
//    使用GCD中的dispatch_once_t
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
//        假设singleton不存在
        if (!singleton) {
//            创建singleton
            singleton = [[Singleton alloc] init];
        }
    });
//    返回singleton
    return singleton;
}

2.2.使用线程锁@synchronized(self){};

+ (Singleton *)shared {
    static Singleton *singleton = nil;
//  使用线程锁
    @synchronized(self) {
        if (singleton == nil) {
            singleton = [[Singleton alloc] init];
        }
    }
    return singleton;
}

2.3注意:

1.以上两种可使用[单例类名 defaultManager]调用方法及属性即可;
2.注意假如我们令_yourList = [CCListManager defaultManager].defaultList;
若你对_yourList执行移除操作[_yourList removeObjectAtIndex:indexPath.row];
则单例类中的defaultList此行也被移除了

代理:

一 : 理解

1.((1)制定协议,在女方)说白就是女方想吃饭,但不想做,就制定协议方法(叫男方去做饭的方法),(2)设置代理人属性(只要给女方做饭谁都能成为女方的代理人),(3)告诉男方我要吃饭(用自省方法实现);
2.(4)男人遵循协议,(5)成为女方的代理,(6)实现女方制定的协议方法(也就是去做饭)
3.注意女方制定的协议分为:@required为必须实现的,@optional为可选择实现的
优点:
1.有利于代码的封装;
2.有利于程序的结构化和层次化;
3.若是@required的方法,没有实现会编译警告/报错
4.一个类可以定义不同的协议,当然,每个协议得对应不同的delegate
缺点:
1.代码量多,协议定义,delegate属性,本身决定什么时候执行代理,实现代理类的实现
2.释放后,delegate要为nil,否则会是野指针,造成内存泄漏,这也是要用weak来声明delegate的原因
3.协议中只能定义方法,不能定义成员变量,属性;
4.假如现在有类A,类B,类C
-类C协议为C_Delegate,点击类C的按钮时,相应协议,输出一句话
-类A和类B都实现了<C_Delegate>方法
-执行的操作是,从类A跳转到类B,从类B跳转至类C,点击类C的按钮,只有类B相应了
场景:
1.后一个界面想前一个界面传值
2.View层向ViewController层传值

二 : 创建

1.女方制定协议

@protocol B_Delegate <NSObject>
//协议方法(必须带参数;想传什么类型的数据,方法的参数类型就是对应的数据类型)
-(void)passValue:(NSString *)value;
@end

2.女方制定代理人属性

//代理属性
@property(nonatomic,assign)id< B_Delegate > delegate;

3.女方选定时机告诉男法实现方法(以按钮事件为例)

//按钮事件(后一个界面进入前一个界面时)
-(void)action_Btn:(UIButton *)btn {
    //通知代理人执行对应的方法
    //+++自省:
    if ([self.delegate respondsToSelector:@selector(passValue:)]) {
//方法:
        [self.delegate passValue:tf.text];
    }
}

4.男方遵循协议

//遵循协议
@interface A_ViewController ()<B_Delegate>
@end

5.男方成为代理人

A_ViewController *a_VC = [[A_ViewController alloc] init];
    //3.设置代理人;
    a_VC.delegate = self;

6.男方实现方法

//协议方法:
-(void)passValue:(NSString *)value {
//此时在前一个界面
    //将后一个界面的值(value)赋给前一个界面需要的
}

扩展:

自定义cell中
1.代理属性
@property (nonatomic,weak) id delegate;
2.方法属性
@property (nonatomic,assign) SEL method;
3.何时响应
- (IBAction)onClickButton:(id)sender { 
if ([self.delegate respondsToSelector:self.method]) { 
[self.delegate performSelector:self.method withObject:self]; 
  }
}
4.tableViewController中
1.tableViewcell实现
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
 static NSString *identifier = @"myCell"; 
myCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
if (!cell) { 
cell = [[[NSBundle mainBundle] loadNibNamed:@"myCell" owner:self options:nil]lastObject];
 //点击事件 
cell.delegate = self;
//添加协议方法
 cell.method = @selector(onClickMainButton:); 
} 
return cell;
}
5.//cell中的协议方法
- (void)onClickMainButton:(myCell *) cell{ 
NSIndexPath *indexPath = [_mainTableView indexPathForCell:cell]; NSLog(@"你点击的是第几行%ld",(long)indexPath.row); 
}

2.属性语义特性

1.代理用weak,不用assign的原因
assign和weak均是指针赋值(直接赋值),不改变索引计数;
但当被销毁时:
assign:如果使用完毕,不将其置为nil,会产生野指针,操作不当会崩溃;
weak:在属性所指的对象遭到摧毁时,属性值也会清空(nil out),不会崩溃
假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,
后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。
此时a 和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?
答案是否定的,因为a并不知道b是否还在使用这块内存,
如果a释放了,那么b在使用这块内存的时候会引起程序crash掉;
2.assigin可以用非 OC 对象,而 weak 必须用于 OC 对象
3. 代理用weak,不用strong的原因,是因为防止循环引用

观察者模式

Copyright © 2019- bangwoyixia.com 版权所有 湘ICP备2023022004号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务