首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Objective-C中NSInvocation的使用

OC中调用方法某个对象的消息呦两种方式: #1. performanceSelector: withObject: #2. NSInvocation....NSInvocation了 直接上代码吧, 会注释清楚 - (void)viewDidLoad { [super viewDidLoad]; //用performanceSelector调用三个参数的方法...:signature]; //设置方法的调用者 invocation.target = self; //设置方法名, 这里一定要跟方法签名类中的方法名一致 invocation.selector...1、如果调用的方法不存在 //此时我们应该判断方法是否存在,如果不存在这抛出异常 if (signature == nil) { //aSelector为传进来的方法 NSString *info =...isKindOfClass:[NSNull class]]) { obj = nil; } [invocation setArgument:&obj atIndex:i + 2]; } 3、判断当前调用的方法是否有返回值

74820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    objective-C 的OOP(上)--类定义、继承及方法调用

    上一篇展示了如何用传统的“面向过程编程方法”,实现画“矩形”、“圆”、“椭圆”,这一篇看下如何改用OOP的方法来实现: 因为要用到“颜色”以及“矩形区域”二个枚举,先把他们抽出来单独放在CommDef.h...结构 typedef struct { int x,y,width,height; } ShapeRect; 然后再定义基类Shape,注意:在obj-C中,定义一个类通常分成二部分,一部分是".h"...@",bounds.x,bounds.y,bounds.width,bounds.height,[super getColorName:fillColor]); } @end 注:上面展示了在obj-C中如何调用父类的方法...%d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,[super getColorName:fillColor]); } @end 最后看下调用的主函数...,在obj-C中id相当于“任意类型”,意为指向某对象的指针(哪怕你不知道这个对象是什么类型),总之,如果你不知道某对象的具体类型时,用它就对了。

    1.2K80

    objective-C中的扩展方法与partial class

    但在obj-C中,这种情况下开发人员新增加的重名方法会覆盖系统原有的方法,而且没有任何提示!一个好的习惯是为所有扩展方法(包括类名),都加一个特殊的前缀或后缀,以避免重名。...表面上看,partial class与扩展方法是风马牛不相及的二个概念,但是在obj-C中,这二个其实是一回事。..."; [bll addProduct:@"iphone4" productNo:@"0001"];//调用Product.h中定义的方法 [bll createOrder:@"0001" quantity...:5]; [bll deleteProduct:@"0001"];//调用Order.h中定义的方法 [bll release]; [pool drain]; return 0;...productNo:0001 皆大欢喜,很多语言和技术真是“一门通,处处通”,也许:c#中的"扩展方法"与"部分类"的设计灵感正是来自objective-C。

    86470

    swift底层探索 05 -深入探讨swift的方法调用机制swift底层探索 05 -深入探讨swift的方法调用机制

    在swift底层探索 03 - 值类型、引用类型一文中解释过值类型和引用类型的内存布局。像这样: ?...【总结】 值类型是直接调用 3. class-方法调用(函数表调用) 3.1 普通方法 借助之前的经验,先使用汇编来看一下调用堆栈。...在类初始化的时候将类中所有方法都放到classWords这个数组中,而且继承 类的方法调用方式:函数表调用。...可以看到class中的方法,是以数组的结构直接存在metaData(原类)的内存里; swift中vtable与oc中method_list区别 oc-method_list ?...发现entension中的方法调用和值类型的调用一致:直接调用 因为在类初始化的时候就已经完成vtable的创建,有继承关系时extension没法找到一个合理的起始位置开发存放entension中的方法

    1.3K30

    Objective-C对方法进行注释的方法

    名字看着挺绕的哈,其实就是对某个自己创建的方法进行注释,类似编写java代码时的注释javadoc一样,可以自动形成规范性的方法说明。...我们对方法进行注释时,最需要说明的就是方法的作用、方法的参数以及方法返回的结果,所以这里也只说这三个标签,其实很简单,如下所示: /** * @brief 通过两个参数请求一个结果....brief表示方法的介绍,param表示参数,如果有多个就多次使用标签,这样在显示时也会显示的更好看,return表示返回的结果。...现在我们调用方法,然后在调用的地方对着方法名,按住option键,也就是alt键,再点击方法名,就会弹出方法的说明,这时就可以看到我们注释的效果了: 这样是不是很清晰明了。...虽然在声明方法时会做很多额外的工作,但是当代码量大了以后,这样做的效果就出来了,免得总是忘记各个方法是做什么的,参数又是什么,毕竟不能总是依靠起名嘛。

    46120

    Objective-C 中 9 种避免使用 Xcode 预处理器宏的方法

    除了极少数例外,使用 Xcode 预处理器宏是一种代码气味。C++ 程序员们已经深有体会:" "。不幸的是,还有很多的 Objective-C 程序员尚未领悟到这一点。...本文是Objective-C 中的代码气味系列文章中的一篇。 这是一个可以在终端运行的便捷命令。它可以检查并显示当前目录下的源文件,预处理器宏的使用情况,你应该仔细检查。...2、Macros - 宏 Smell #define WIDTH(view) view.frame.size.width 使用 Objective-C 并不意味着不能使用普通的 C 语言函数!...*const JMRResponseSuccess = @"Success"; 6、条件编译:注释代码 各种形式的条件编译(#if、#ifdef 等)是一种选择性启用或禁用代码块的方法。...创建一个工厂方法,使用 #if 创建正确的子类。(我们引入预处理器的一种用法,这样就可以消除其他用法)。 找到每个实例化原始类的地方。让它调用工厂方法。 编译和测试每个项目。

    14610

    Objective-C中的集合类

    下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习...在Objective-C中的集合类中主要包括不可变的数组--NSArray,  可变的数组--NSMutableArray,   不可变的字典--NSDictionary,    可变的字典--NSMutableDictionary...NSArray也是OC中的一个对象,使用NSArray也需要进行实例化,前面的博客在类的初始化中提到了便利初始化函数和便利构造器,在NSArray中也少不了这两样东西我们可以通过NSArray的便利初始化函数或者便利构造器进行...                字典的遍历方法是通过字典里的-(NSArray *)allKeys获取所有的key存入数组中然后通过遍历数组获取key对应的value,封装成函数如下: 1 2 3 4...1.不可变集合NSSet     ​    ​    ​    ​(1)NSSet的初始化和其他集合类一样也有其对应的便利初始化方法和便利构造器,     ​    ​    ​    ​    ​    ​

    1.1K70

    Objective-C中的属性机制

    Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现。...和setter来访问被隐藏的实例变量,OC中的属性机制就为我们提供了默认的getter和setter方法。...在使用getter和setter方法时有一点要注意:以neme为例,getter方法名为 name, 而setter的名为 setName;在使用getter和setter方法时和普通的函数用法一样 ​...//调用name的setter方法 [student setName : @"ludashi"]; //调用name的getter方法 NSString *name = [student name];...NSString *name = student.name; 上面调用getter和setter方法的方式看着想是直接操作类的属性,其实不然,也是通过方法来操作的。     ​

    1.3K70

    Objective-C中的内存管理

    OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象是时,会将该对象的引用计数器加1(通过retain来实现);当访问一个对象结束时...在NSObject类有一个retainCount方法,调用该方法可获取当前对象的引用计数值。         ...等方法的,需要在XCode中进行设置,设置如下: 把Objective-C Automatic Reference Counting 改为NO,即可。     ​    ​...FomatRetainCount = 3 2014-08-03 20:18:37.240 Memory[2499:303] 传入的变量RetainCount = 3     ​Objective-C中得...不能显式调用dealloc语句, 或者实现或调用retain, release, retianCount 和 autorelease等方法。     ​    ​    ​

    81290

    从 Objective-C 和 Swift 看字典的性能优化(1)

    一、·NSDictionary· 结构简介 1、类簇 在 iOS 的系统库中,很多集合类都是类簇。...: obj }; 在字典的初始化过程中,+[NSDictionary dictionaryWithObjects:forKeys:count:]会先调用objc_alloc 进行初始化 ?...返回 +[NSDictionary dictionaryWithObjects:forKeys:count:] 后,会拼装一个新的方法调用 -[__NSPlaceholderDictionary initWithObjects...,其内部结构如下: classDiagram class __NSDictionaryI { ## 当前使用的数量 unsigned _used : 57; ## 是否复制 key unsigned...image 3 代表该字典可以存储的键值对数量 随后,会通过位移计算 __NSDictionaryI 额外的体积占用,并调用 __CFAllocateObject 创建对象 本例中,字典最多持有 3 个键值对

    1.1K20

    MessageMock : 优雅的模拟 Objective-C 方法

    拿到切面过后,就可以拦截到所有的 Objective-C 方法调用,具备了做任何“坏事”的条件。...但值得注意的是,MessageMock 代码必经路径不能包含任何的 Objective-C 方法调用,不然会死循环,所以源码大部分是使用 C++ / Assembly 实现的。...一旦游离对象被某个方法使用,最好的方式是持续到origin_msgSend方法调用结束再release。...上层使用的考虑 而考虑到上层接口是在 Objective-C 环境中运行,若一个作用域还未结束,这个MethodMatcher *就被释放了就会 Crash,所以上层接口层面是这样设计的: @implementation...另外,源码中的 C++ / Assembly 不是专业的、性能和设计也不是最优的,望各大佬指点一二不胜感激。

    85720

    Swift和Objective-C混编在有赞移动的实践

    )中导入需要暴露给 Swift 模块的 Objective-C 类,即可在 Swift 中访问相应 Objective-C 的类和方法 Objective-C 访问 Swift 在 Objective-C...用 Swift Module 系统,需要用到的 Objective-C 类用 import xxx 进行引用,即可在 Swift 中访问相应的 Objective-C 的类和方法 Objective-C...访问 Swift 在 Objective-C 类中导入 ProductName-Swift.h,即可访问 Swift 中暴露给 Objective-C 的类和方法 由于我们目前的业务比如商品模块、消息模块...5.5 Swift 调用 Objective-C 将 Swift 模块文件中,用import xxx 的形式进行模块的引用,包括 Objective-C 的二/三方库 5.6 Objective-C 调用...Swift Swift 类中将需要暴露给 Objective-C 模块引用的类,用 public 申明 Swift 类中需要暴露给 Objective-C 的方法要用关键字 @objc 在 Objective-C

    2.3K20

    为什么wait和notify方法要在同步块中调用?

    (); synchronized (lock) { lock.wait(); lock.notifyAll(); } } 也就是说wait和notify方法要在基于同一个对象的同步块中使用...为什么wait和notify方法要在同步块中调用? 我们先来发出一个灵魂拷问:什么时候才需要wait? 什么时候又需要notify?...我们假设我们要实现一个堵塞队列,如果不加同步块,我们的实现方法可能如下。...所以:wait和notify方法要在同步块中调用的根本原因是,这两个方法存在竞态条件。如果不加锁的话,那么wait被调用的时候可能wait的条件已经不满足了(如上述)。...由于错误的条件下进行了wait,那么就有可能永远不会被notify到,所以我们需要强制wait/notify在synchronized中

    1K20

    Objective-C中的语法糖

    当时把注意力放在了深浅拷贝的内存地址分析上了,就没太在意,测试做完啦,在回顾的时候发现数组是用下标的方式获取的! 于是就有了个疑问,在OC中这样写也行?...不是NSArray中有一个方法叫做objectAtIndex来专门获取数组的元素嘛,嗯~用下标也行?此时心里窃喜,可以简化一下数组访问元素的方式了,又可以偷懒啦!!...为了更好的偷懒,于是去百度上Google啦一下这是‘ Xcode 4.4中LLVM compiler 4.0’ 引入的新特性(2012年WWDC发布的东西)。...    在之前的博客中我是这样初始化NSArray的: 1 //NSArray的便利初始化 2 NSArray *array1 = [[NSArray alloc] initWithObjects:@...NSNumber *c = @('a'); NSLog(@"a = %@, b = %@, c = %@", a, b, c);

    1K50
    领券