cocoa设计模式

来源:互联网 发布:淘宝快递单模板 编辑:程序博客网 时间:2024/06/09 07:32

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
原创粉丝点击