使用runtime来获取苹果私有属性

案例

  - 当我们使用导航栏控制器UINavgationController时,并且在使用系统的返回按钮时,系统还会有一个UIScreenEdgePanGestureRecognizer的手势,而且往往有时我们会自定义一个漂亮的返回按钮,这时我们就需要自定义一个按钮,并且添加一个手势。这个很容易是不是?没错,但是让你手势的target和@Selector用苹果自带的应该怎么做呢?今天我们要做的就是这个。

  

步骤

  1.通过下图打印,我们可以看出action,target的值,但是如何取出这个target呢?

    - KVC:前提条件:必须知道属性名

    - 运行时

  2.想要使用运行时首先必须导入一个头文件objc/runtime.h

#import <objc/runtime.h>

  3.利用runtime获取属性名

    - 遍历某个类里面所有属性 Ivar:表示成员属性

    - copyIvarList只能获取哪个类下面的属性,并不会越界(不会把它的父类的属性给遍历出来)

    - Class 获取哪个类的成员属性

    - count:告诉你当前类里面成员属性的总数

unsigned int count = 0;
    // 返回成员属性的数组
    Ivar *ivars = class_copyIvarList([UIGestureRecognizer class], &count);

    for (int i = 0; i < count; i++) {
        // 取出成员变量
        Ivar ivar = ivars[i];

        // 获取属性名
        NSString *ivarName = @(ivar_getName(ivar));

        NSLog(@"%@",ivarName);

    }

  4.打印每一个成员属性,这时可以看到_targets这个看起来像的一个属性,接下来我们来验证一下。

  5.获取这个key的value值,通过打印发现系统重写了descriptions属性,我们并没有得到想要得到的属性,然而这并没有什么卵用,我们可以通过断点来得到。

  // 获取这个属性的值  NSArray *targets = [self.interactivePopGestureRecognizer valueForKeyPath:@"_targets"];

    id objc = [targets firstObject];
    NSLog(@"%@",objc);

    id target = [objc valueForKeyPath:@"_target"];

  - 这并不是我们想要的

  - OK,这才是我们想要的,成功获取_target这个属性

  - 打印target,这就是我们想要的

  结论:通过运行时可以取出当前类下面的所有属性。今天就讲到这里面了,下期我会写一个如何通过运行时来做字典转模型的操作,因为有时我们的字典里面的key有时候是关键字,所以我们可能不能直接定义为属性,详情下期见。

时间: 2024-10-03 14:41:38

使用runtime来获取苹果私有属性的相关文章

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

webapp之路--apple私有属性apple-touch-icon

以前我们用过favicon在浏览器给网站进行身份标识,用法如下: [html] view plaincopy <link href="http://image.feeliu.com/web/favicon.ico" rel="shortcut icon" /> <link href="http://image.feeliu.com/web/favicon.ico" rel="Bookmark" /> 现

Java中子类继承了父类的私有属性及方法吗?

最近学习继承,从书中看到子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,但是私有的方法似乎不能简单的访问,这里暂不考虑Java反射机制,于是我分析,子类不能继承父类私有的属性及方法,但是分析了内存后,我发现我是错的,在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象.所以所谓的继承使子类拥有父类所有的属性和方法

iOS runtime探究(三): 从runtime开始理解OC的属性property

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639303 本文主要讲解runtime相关知识,从原理到实践,由于包含内容过多分为以下五篇文章详细讲解,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制 从runtime开始: 理解OC的属性property 从runtime开始: 实践Category添加属

Python全栈--9.1--面向对象进阶-super 类对象成员--类属性- 私有属性 查找源码类对象步骤 类特殊成员 isinstance issubclass 异常处理

上一篇文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 注意点: self ,我们讲过了,self = 对象,实例化后的对象调用类的各种成员的时候的self就是这个对象. 而且我们也讲过了

反射学习3-通过反射机制修改类中的私有属性的值

 一.准备知识:    Java反射机制以及域的获取与设置的相关方法  二.实现步骤: 1.首先创建一个类包含一个私有属性: class PrivateField{     private String username = "Jason"; } 2.通过反射机制修改username的值: //创建一个类的对象 PrivateField privateField = new PrivateField(); //获取对象的Class Class<?> classType =

iOS开发——运行时OC篇&amp;使用运行时获取系统的属性:使用自己的手势修改系统自带的手势

使用运行时获取系统的属性:使用自己的手势修改系统自带的手势 有的时候我需要实现一个功能,但是没有想到很好的方法或者想到了方法只是那个方法实现起来太麻烦,一或者确实为了装逼,我们就会想到iOS开发中最牛逼的技术运行时(Runtime) 关于运行时这里就不多说了,请查看笔者之前搬过来了精选文章,这里主要是怎么在实际开发中使用运行时实现我们想要的功能. 比如,在iOS开发中有这样一个问题,关于导航栏中我们点击一个按钮会跳到对应的子控制器,但是这里问题就来了,我们在对应的字控制器中可以点击对应的back

得到父类的私有属性

android.widget.ArrayAdapter类mObjects为私有属性:private List<T> mObjects;若要获取这个属性:可以在子类中定义一个属性,把这个属性赋值给mObjects, 代码如下:getObjects()就会获取父类的私有属性 1 import android.content.Context; 2 import android.view.View; 3 import android.view.ViewGroup; 4 import android.w

私有属性的另类访问方式

# -*- coding: utf-8 -*- #python 27 #xiaodeng #http://blog.itpub.net/26250550/viewspace-1411768/ #私有属性的另类访问方式 #这里利用的好像是一种伪私有的机制 class MyClass(): def __init__(self): self.__name='xiaodeng' self.age=28 def printName(self): return self.__name def __print