zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

IOS NSInvocation应用与理解

ios应用 理解
2023-09-14 08:59:45 时间

IOS中有一个类型是SEL,它的作用很相似与函数指针,通过performSelector:withObject:函数可以直接调用这个消息。但是perform相关的这些函数,有一个局限性,其参数数量不能超过2个,否则要做很麻烦的处理,与之相对,NSInvocation也是一种消息调用的方法,并且它的参数没有限制。这两种直接调用对象消息的方法,在IOS4.0之后,大多被block结构所取代,只有在很老的兼容性系统中才会使用,简单用法总结如下:

一、初始化与调用

在官方文档中有明确说明,NSInvocation对象只能使用其类方法来初始化,不可使用alloc/init方法。它执行调用之前,需要设置两个方法:setSelector: 和setArgument:atIndex:


    //创建一个函数签名,这个签名可以是任意的,但需要注意,签名函数的参数数量要和调用的一致。
    NSMethodSignature * sig  = [NSNumber instanceMethodSignatureForSelector:@selector(init)];

注意:签名函数的参数数量要和调用函数的一致。测试后发现,当签名函数参数数量大于被调函数时,也是没有问题的。

调用多参数的方法,我们可以这样写:


    NSMethodSignature * sig  = [[self class] instanceMethodSignatureForSelector:myMethod];

注意:1、这里设置参数的Index 需要从2开始,因为前两个被selector和target占用。下面这样写也没有任何问题:


    NSMethodSignature * sig  = [[self class] instanceMethodSignatureForSelector:myMethod];

二、NSInvocation的返回值

NSInvocation对象,是可以有返回值的,然而这个返回值,并不是其所调用函数的返回值,需要我们手动设置:


    NSMethodSignature * sig  = [[self class] instanceMethodSignatureForSelector:myMethod];

三、关于内存

可以注意到- (void)retainArguments;这个方法,它会将传入的所有参数以及target都retain一遍。


iOS 10 中的 NSPersistentContainer 本文讲的是iOS 10 中的 NSPersistentContainer,我们也接收以 NSPersistentContainer 形式的简化版的 Core Data stack,它为我们做了大部分的准备工作。它值得我们去尝试么?让我们开始深入挖掘这些新特性吧。