访问私有变量或方法

2023-11-04

本文主要介绍一下如何访问类的私有成员变量以及类的私有方法,这里以下面这个类来举例:

@interface HomeController : UIViewController {
    NSString *name2;
}
@property (nonatomic, copy) NSString *name3;
@end
@interface HomeController () {
    int index;
    NSString *name1;
}
@property (nonatomic, strong) UILabel *msgLbl;
@end



@implementation HomeController
- (void)viewDidLoad {
    [super viewDidLoad];
    self.msgLbl = [[UILabel alloc] init];
    self.msgLbl.font = [UIFont systemFontOfSize:14];
    self.msgLbl.textColor = [UIColor blackColor];
    self.msgLbl.text = @"主界面";
    self.msgLbl.textAlignment = NSTextAlignmentLeft;
    self.msgLbl.backgroundColor = [UIColor clearColor];
    [self.view addSubview:self.msgLbl];

    [self getPropertyList];
    [self getIvarList];
    [self getInstanceMethodList];
    [self getClassMethodList];
}



- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    self.msgLbl.frame =CGRectMake(20,40, 60, 20);
}


+ (void)classMethod {
    NSLog(@"*** private class methods");
}



//获取类的属性
- (void)getPropertyList {
    //属性个数
    unsigned int count;
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    for (int i =0; i < count; i++) {
        objc_property_t property = properties[i];
        const char *name = property_getName(property);
        NSString *nameStr = [NSString stringWithCString:name encoding:NSUTF8StringEncoding];
        NSLog(@"***属性名:%@", nameStr);
    }
    free(properties);
}



//获取类的成员变量
- (void)getIvarList {
    unsigned int count;
    Ivar *ivarList = class_copyIvarList([self class], &count);
    for (int i =0; i < count; i++) {
        NSString *nameStr = [NSString stringWithUTF8String:ivar_getName(ivarList[i])];
        NSLog(@"***ivarName:%@", nameStr);
    }
    free(ivarList);
}



//获取一个类的实例方法列表
- (void)getInstanceMethodList {
    unsigned int count; 
    Method *methods = class_copyMethodList([self class], &count);
    for (int i =0; i < count; i++) {
        SEL name = method_getName(methods[i]);
        NSLog(@"***实例方法名:%@",NSStringFromSelector(name));
    }
    free(methods);
}



//获取一个类的类方法列表
- (void)getClassMethodList {
    unsigned int count;
//    const char * class_name = class_getName([self class]);
//    Class metaClass = objc_getMetaClass(class_name);
    Method *methods =class_copyMethodList(object_getClass([self class]), &count);
    for (int i =0; i < count; i++) {
        SEL name = method_getName(methods[i]);
        NSLog(@"***类方法名:%@",NSStringFromSelector(name));
    }
    free(methods);
}


- (void)privateMethod {
    NSLog(@"*** private instance methods");
}

 

1.如何访问类的私有成员变量,有两种方法:KVC和RunTime机制,我们可以通过上述类中的getIvarList方法来获取类的所有成员变量,经过和类的.h文件比较,如果不在.h文件中出现的则为其私有成员变量.这里我们拿name1这个私有成员变量来举例:

通过RunTime来设置:

    HomeController *homeVC = [HomeController new];    

    Ivar ivar = class_getInstanceVariable([homeVC class], [@"name1" UTF8String]);

    const char *ivarType = ivar_getTypeEncoding(ivar);

    NSLog(@"*** ivar type:%@", [[NSString allocinitWithCString:ivarType encoding:NSUTF8StringEncoding]);

    

    object_setIvar(homeVC, ivar, @"pwf2006");

    NSString *ivarValue = object_getIvar(homeVC, ivar);

    NSLog(@"*** ivar value:%@", ivarValue);

    输出结果如下:

     2016-08-19 22:31:58.240 FirstGit[18695:7136558] *** ivar type:@"NSString"

     2016-08-19 22:31:58.240 FirstGit[18695:7136558] *** ivar value:pwf2006

 

通过KVC来设置:

    [homeVC setValue:@"pwf2007"forKey:@"name1"];

    NSLog(@"*** ivar value:%@", [homeVCvalueForKey:@"name1"]);

    输出结果如下:

     2016-08-19 22:31:58.241 FirstGit[18695:7136558] *** ivar value:pwf2007

 

2.通过getInstanceMethodList方法我们可以获取类实例的所有方法,包括私有的方法,我们拿privateMethod来进行举例:

   

   objc_msgSend(homeVC,@selector(privateMethod));

    输出结果如下:

     2016-08-19 22:31:58.241 FirstGit[18695:7136558] *** private instance methods

   

通过getClassMethodList获取一个类的类方法列表,包括私有的类方法,我们拿classMethod这个类方法举例:

  objc_msgSend([homeVCclass],@selector(classMethod));

   输出结果如下:

   2016-08-19 22:31:58.241 FirstGit[18695:7136558] *** private class methods

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问私有变量或方法 的相关文章

  • 使用 Objective-C 将 XMP 数据嵌入到 PNG

    我需要将自定义 XMP 文件嵌入到 iOS 应用程序中的 PNG 中 到目前为止 我能做的就是编译 Adob e XMP 工具包 生成 Xcode 项目 然后正确编译该项目 从那里我不知道如何在我的 Xcode 项目中使用该库以及如何使用它
  • 在 UIPageViewController 中跟踪页面索引的可靠方法 - Swift

    我在位于常规 UIViewController 中的容器内有一个 UIPageViewController 自定义 我需要能够在每次页面更改时调用一个事件 但前提是它确实发生了变化 而不仅仅是一半或类似的事情 using func page
  • iCarousel 滚动不顺畅

    我正在使用 iCarousel 滚动标签 在模拟器上一切正常 但在 iPad iPhone 上滚动不顺畅和快速 这是代码 城市列表视图 h import
  • UITableview Commit EditingStyle 具有多个按钮? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何在 UITableview 提交编辑样式中添加多个按钮 我需要显示一个带有删除按钮的更多按钮 由于无法使用公共API 所以你可以更好地
  • 使用 JSONDecoder 解码的对象的打印输出出现问题

    我正在尝试快速解码 JSON 字符串 但在解码后访问属性时遇到一些奇怪的问题 这是我从本地存储的 JSON 文件检索的 JSON 文件的内容 word a usage partOfSpeech determiner 这是访问 JSON 文件
  • iOS WebView 空白

    我已使用 YouTube 的标准嵌入网址在我的 iOS 8 3 应用程序中嵌入了 YouTube 视频 sample http www youtube com embed HkAK9QRe4ds 它按预期工作 但看起来很奇怪 那个白色间隙
  • ARC 项目中出现“Missing [super dealloc]”警告

    我已经将一个项目重构为 ARC 看起来不错 但是有一个对象使用通知中心 我在自定义的 dealloc 方法中删除了观察者 这在非 ARC 项目中效果很好 它也适用于 ARC 但我收到一个疯狂的警告 方法可能缺少 super dealloc
  • Xcode 代码覆盖率和 fopen$UNIX2003

    我面临着一个似乎相当广泛的问题 当我使用 Lion 激活 Xcode 4 2 1 中的代码覆盖率时 它显示以下错误 Detected an attempt to call a symbol in system libraries that
  • 获取添加为子视图的 UIView 的可见矩形

    如上图所示 UIView A 和 UIView C 添加到 UIView B 上 B ClipToBounds 为 YES 因此红色区域不可见 是否有可能获得 A 和 C 的可见矩形 用线条显示 当我触摸视图 A 时 我需要在可见区域显示矩
  • ios UIPanGestureRecognizer 指针位置

    UIPanGestureRecognizer panRecognizer UIPanGestureRecognizer alloc initWithTarget self action selector pan self addGestur
  • 如何在HTTP post中向PHP服务器发送多个参数

    我正在将 base64 字符串发送到 php 服务器 并且运行良好 现在我想以字符串形式发送另一个参数 谁能告诉我下面的代码中需要添加什么代码 下面的代码适用于单个参数 我们如何修改它的多个参数 NSData data UIImageJPE
  • Captive Wifi 弹出窗口:单击链接打开 Safari

    我们的 iOS 设备 ipad iphone 等 网络出现问题 连接到 SSID 后 iphone ipad 立即打开强制网络助手 CNA 它就像一个缩小版的浏览器 没有导航按钮等 显示我们的欢迎页面 准备好让用户在网络中验证他的 MAC
  • 检查url图片是否存在

    我正在尝试使用 if 语句检查 url 图像是否存在 然而 当尝试通过错误的图像网址测试它时 它会不断返回 致命错误 在解包可选值时意外发现 nil code var httpUrl subJson image url stringValu
  • 我安排一个计时器使用 readRSSI 函数读取 RSSI,但是当我的应用程序进入后台时计时器停止

    我安排一个计时器使用 readRSSI 函数读取 RSSI 但是当我的应用程序进入后台时计时器停止 也许有一个好方法可以在应用程序进入后台时从外围设备的通知中获取 RSSI 值 但我不知道该怎么办 有人可以帮助我吗 有人有更好的方法吗 我也
  • 在 iOS 上保存(私人)应用程序设置?

    我知道NSUserDefaults用于保存 恢复user优先 什么是等效类应用 例如 应用程序可能有一个 上次运行 字段 或者它可能有一个用于在应用程序级别使用的设备的唯一标识的字段 我的目的是将应用程序的设置 而不是用户的设置 保留在设置
  • 是否可以在“NSFetchRequest”中按子类排序而不添加其他属性?

    我想对结果进行分组NSFetchRequest按实体 这些实体都共享相同的抽象父级 例如 animal cat dog The NSFetchRequest has includesSubentities set TRUE and enti
  • 在 iPhone 应用程序中获取路线和路线导航

    我正在开发一款应用程序 该应用程序将重点关注在驾驶时为用户提供路线和逐段指示 他们在驾驶过程中留在应用程序中非常重要 因此我真的不想让他们离开应用程序并转到内置的地图应用程序 我最近对如何包含此功能进行了大量研究 众所周知 这并不容易 因为
  • 无法识别的选择器发送到类

    我已经看到 这是一个常见问题 但我自己找不到任何解决方案 这是代码 class ButtonViewController UIViewController override func viewDidLoad super viewDidLoa
  • UICollectionViewFlowLayout IOS的​​minimumLineSpacing属性

    对于UICollectionViewFlowLayout的属性minimumLineSpacing 苹果的文档说 对于垂直滚动网格 该值表示最小值 连续行之间的间距 对于水平滚动的网格 该值表示连续列之间的最小间距 我测试它和代码的一部分是
  • iOS Facebook SDK - 远程定义 FacebookAppID

    使用iOS Facebook SDK 3 0 需要在应用程序的info plist中定义FacebookAppID和相关的URL Scheme 我想远程定义这些 向我自己的服务器请求应用程序 ID 所以有两个不同的问题 我可以在运行时更改应

随机推荐

  • 经典网络结构梳理:Mobilenet网络结构

    论文下载地址 https arxiv org abs 1704 04861 Caffe复现地址 https github com shicai MobileNet Caffe Mobilenet发布在2017年的CVPR Mobilenet
  • CURL命令

    生成一个ca证书 openssl pkcs12 in test p12 out test crt 使用证书访问 curl cert test p12 cert type P12 cacert test crt header content
  • unity进阶--xml的使用学习笔记

    文章目录 xml实例 解析方法一 解析方法二 xml path 创建xml文档 xml实例 解析方法一 解析方法二 xml path 创建xml文档
  • 利用 RDMA 技术加速 Ceph 存储解决方案

    利用 RDMA 技术加速 Ceph 存储解决方案 晓兵XB 云原生云 2023 04 29 20 37 发表于四川 首发链接 利用 RDMA 技术加速 Ceph 存储解决方案 在本文中 我们首先回顾了 Ceph 4K I O 工作负载中遇到
  • Linux内核:系统调用大全(持续更新中)

    系统调用 1 sys brk 1 sys brk 系统调用sys brk的函数原型 sys brk 是一个操作系统调用 用于更改进程的堆空间大小 sys brk 函数接收一个无符号长整型参数brk 表示要求的新的程序数据段 堆 结束地址 如
  • Kubernetes 之深入理解 DaemonSet

    文章目录 Daemon Pod 的 过人之处 Daemon Pod 的定义 如何保证每个 Node 只有一个被管理的 Pod 何为 Toleration DaemonSet 是一个非常简单的控制器 DaemonSet 的使用方法 Daemo
  • 博思得标签打印机驱动_博思得V6驱动

    博思得Postek V6标签打印机驱动是博思得Postek品牌旗下V6型号标签打印机使用的驱动程序 这款驱动程序可以为您解决标签打印机连接不上电脑的情况 并且可以为您解决两者之间的故障 使用更便捷 博思得Postek V6标签打印机驱动安装
  • Appium自动化框架从0到1之 Driver配置封装

    不管是调用模拟器 还是调用真机 都需要准备一些driver的参数 以便被调用 思想 我们把driver配置信息 封装到yaml文件 然后通过读取yaml文件的内容 调用其driver信息 为了更直观的看如何封装 我们直接上代码 caps y
  • shell单双引号嵌套+变量

    metadata annotations volume kubernetes io selected node TARGET NODE
  • 云计算中微服务是什么Java之命名、标示符、变量

    微服务架构是一种架构模式 它提倡将单一应用程序划分成一组小的服务 服务之间相互协调 互相配合 为用户提供最终价值 每个服务运行在其独立的进程中 服务和服务之间采用轻量级的通信机制相互沟通 每个服务都围绕着具体的业务进行构建 并且能够被独立的
  • 【笔试强训选择题】Day34.习题(错题)解析

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 笔试强训选择题 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 文章目录 前言 一 Day34习题 错题 解析1 总结 前言 一 Day34习题 错题 解析 1 解析
  • 升级 Linux 系统中的 Python 版本

    升级 Linux 系统中的 Python 版本 Python 是一种非常流行的编程语言 广泛应用于各种领域 包括 Web 开发 数据分析等 而对于 Linux 系统来说 Python 更是一个必须的组件 在系统运行和管理中都扮演了重要的角色
  • 大模型Founation Model

    一 背景 自从chatgpt gpt4以特别好的效果冲入人们的视野中 也使得AI产业发生了巨大变革 从17年以来的bert 将AI的各种领域都引入bert类的fine tune方法 来解决单个领域单个任务的一一个预训练模型 在学术界和工业界
  • 谈谈Linux epoll惊群问题的原因和解决方案

    近期排查了一个问题 epoll惊群的问题 起初我并不认为这是惊群导致 因为从现象上看 只是体现了CPU不均衡 一共fork了20个Server进程 在请求负载中等的时候 有三四个Server进程呈现出比较高的CPU利用率 其余的Server
  • 如何区分成员函数和构造函数?

    在面向对象编程中 成员函数和构造函数是类中定义的两种不同类型的函数 构造函数是一个特殊的成员函数 用于创建并初始化类的对象 构造函数的名称必须与类的名称相同 它没有返回值 并且在对象创建时自动调用 构造函数可以有参数 这些参数用于初始化类的
  • 字符串查找之 KMP 算法思路讲解和代码实现

    算法介绍 KMP 算法是一种改进的字符串匹配算法 由 D E Knuth J H Morris 和 V R Pratt 提出的 KMP 算法的核心是利用匹配失败后的信息 尽量减少模式串与主串的匹配次数以达到快速匹配的目的 KMP 算法的时间
  • lab值意义_色差仪lab值如何分析

    色差仪在涂料 建材 油漆 涂料 纺织印染 油墨 塑料 染料颜料制造等表面色料工业的配色方面有着广泛的应用 也称为CIELAB均匀色空间 本文深圳京联泰科技给大家就色差仪LAB值如何分析作说明 L 亮度 轴表示黑白 0为黑 100为白 a 红
  • 树莓派常用命令

    刷系统 格式化 这样就ok了 开启ssh 刷完系统在boot盘跟目录创建文件ssh就可以了小写不需要后缀 汉化 sudo raspi config 选4 再选1 然后把 4个前面是 zh cn的 用 空格选中 然后 ok 选zh CN ut
  • 科研无人机平台P600进阶版,突破科研难题!

    随着无人机技术日益成熟 无人机的应用领域不断扩大 对无人机研发的需求也在不断增加 然而 许多开发人员面临着无法从零开始构建无人机的时间和精力压力 同时也缺乏适合的软件平台来支持他们的开发工作 为了解决这个问题 我们特别开发了科研无人机平台P
  • 访问私有变量或方法

    本文主要介绍一下如何访问类的私有成员变量以及类的私有方法 这里以下面这个类来举例 interface HomeController UIViewController NSString name2 property nonatomic cop