cocoa设计模式

1M_V_C

模型类:应该使用独立于表现层的方式封装数据,应该只引用模型类不应该引用视图或者控制器类,模型类是可变或不可变:

不可变的好处是节约时间和内存,在没有锁定的情况下是线程安全的,应该尽量使用不可变的

视图类:负责与用户交互,提供信息并且接受用户事件,但是自己不处理,交由控制器处理,除了父视图与子视图外,不应该引用其他视图或控制器

控制器:实现大部分应用程序的特定逻辑,在模型类与视图类之间起协调作用,访问全局对象时应该创建单例,


2委托-策略模式

一般而言对象不保留他们的委托,应该将委托声明为weak,因为但大多数情况是,对象的委托就是其控制器,而控制器总是保留的,如果对象想在保留委托就会形成循环引用,内存泄露


3命令模式

命令模式就是将请求封装成一个对象,与直接调用不同,必须把方法调用打包放进一个对象,之后可能调用,可以提高灵活性,允许请求排队,重定向,记录和序列化

1使用方法签名和调用

NSinvocation将目标,选择器,方法签名和所有的参数放进一个对象里,可以先存储以备调用,当NSinvocation被调用时,他会发消息,OC运行时会找到正确的方法来执行

方法实现IMP是一个纸箱如下签名的C函数的函数指针

id function(id self ,SEL _cmd..)

目标是接收消息的对象,选择器则是被发送的消息,就是方法的名称,如[nsstring length]和[nsdata length]虽然实现发放不一致但是他的选择器确实相同的

还包含一个方法签名(NSMethodSigature),封装了一个方法的返回类型和参数类型,只有返回类型和参数类型

NSMethodSigature * sig =[NSMethodSigature sigarureWithOBJCTypes:"@@:*"];

第一个@表明返回值是一个id   接下来@:表明方法接受一个id和SEL 最后的*表明第一个“真实”参数是一个字符串char*

有了选择器和签名,可以使用一个目标和参数值将他们联系起来构建一个NSinvocation 包含传递信息的一切 以下代码可以在[set addobject:stuff]调用

NSMutableSet *set =NSMutableSet set];

NSString * str = @"stuff";

SEL selector = @Selector(addObject:);

NSMethodSigature * sig = [set methodSigatureForSelector:selector];


Nsinvocation *invocation =[Nsinvocation invocationWithSigature:sig];

[invocation setTarget:set];

[invocation setSelector:selector];

[invocation setArgument:&str atIindex:2];//添加多个参数

[invocation invoke];


第一个参数至于2 因为0与1位置分别是target和selector    用处:

1 声明@dynamic动态属性 ,根据以下方法可以动态生成setter,getter方法  

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;

- (void)forwardInvocation:(NSInvocation *)anInvocation;


2消息转发不受空间限制,只要获取到方法签名即可调用,在撤销操作时可调用

NSMethodSignature *sig = [selfmethodSignatureForSelector:@selector(addAlbum:atIndex:)];

NSInvocation *undoAction = [NSInvocationinvocationWithMethodSignature:sig];

[undoAction setTarget:self];

[undoActionsetSelector:@selector(addAlbum:atIndex:)];

[undoActionsetArgument:&deletedAlbumatIndex:2];

[undoActionsetArgument:&currentAlbumIndexatIndex:3];

[undoActionretainArguments];

    // 3

[undoStackaddObject:undoAction];


NSInvocation放入数组中逐个调用可实现效果


4观察者模式(kvo,通知)


5单例模式


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值