IOS高级开发 runtime(1)

本文深入探讨了Objective-C runtime在iOS开发中的应用,特别关注如何通过runtime为已有类添加属性,解决继承与分类之间的局限性。通过实例演示了如何使用objc_setAssociatedObject和objc_getAssociatedObject来动态添加属性,并且详细解释了如何在分类的.m文件中重写getter和setter方法以确保属性的正确使用。

一、 简介

IOS 开发中灵活使用runtime 会提高我们的程序性能和开发速度。要想使用runtime,首先要引入系统的头文件。

#import <objc/runtime.h> 

当我们查看runtime.h的时候,我们会发现,其实runtime是很有条理的

const char *object_getClassName(id obj)                     //获取对象的类

Ivar *class_copyIvarList(Class cls, unsigned int *outCount) //获取类的变量列表

unsigned method_getNumberOfArguments(Method m)              //获取函数变量的个数

属性 其实就是get/set 方法。我们可以使用  objc_setAssociatedObject/objc_getAssociatedObject  实现 动态向类中添加 方法

objc_setAssociatedObject 需要四个参数:源对象,关键字,关联的对象和一个关联策略。
//1 源对象alert
//2 关键字 唯一静态变量key associatedkey
//3 关联的对象 sender
//4 关键策略  OBJC_ASSOCIATION_RETAIN_NONATOMIC

通过 objc_getAssociatedObject获取关联对象

使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。

二、runtime 大招


     2.1)为已有的类添加属性

OC语法允许我们通过继承或者添加分类(category)修改(也不能说修改,就是改造成我们需要的类)已有的类。继承在这里不是我们想讨论的,主要是想说一下分类。分类可以允许我们添加属性(不会生成get和set方法,需要手动添加)和方法,但是却不允许我们添加成员变量。但是有些时候,我们需要添加一个变量来扩充这个类,比如:我有一个类Person类,带有age 和name 属性

  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface zzPerson : NSObject  
  4.   
  5. @property(nonatomic,weak)NSString *name;  
  6. @property(nonatomic,assign)NSInteger age;  
  7.   
  8. @end  
但是,后来我们发现,仅仅这两个属性是不够描述的,我们还需要添加一个job属性来描述一个人。因此我们想到了用分类来添加属性。

  1. #import "zzPerson.h"  
  2.   
  3. @interface zzPerson (Job)  
  4.   
  5. @property(nonatomic,copy)NSString* job;  
  6.   
  7. @end
 但是事情往往没有那么简单,当我们运行程序时就会发现,程序崩溃了。
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     DZLPerson *p=[[zzPerson alloc] init];  
  5.     p.age=25;  
  6.     p.name=@"皮拉夫大王";  
  7.     p.job=@"ios";  
  8.       
  9.     NSLog(@"%@",p);  
  10.   
  11. }
  12. 2015-04-10 00:05:50.591 runtime讲解[4197:209347] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason'-[DZLPerson setJob:]: unrecognized selector sent to instance 0x7fe809f24790'  
程序提示我们:找不到setJob方法。这是理所当然的,因为系统不能为我们自动添加成员变量了,也就不知道该如何帮我们创建setter 和getter方法了。但是我们可以通过runtime来添加属性,使我们能够像真正的修改了Person类那样使用新的属性job。

首先在分类的.m 中导入runtime头文件,然后重写job的getter 和setter 方法。

  1. #import "zzPerson+Job.h"  
  2. #import <objc/runtime.h>  
  3.   
  4.   
  5. static NSString *key=@"zz"//利用静态变量地址唯一不变的特性  
  6.   
  7. @implementation zzPerson (Job)  
  8.   
  9. -(void)setJob:(NSString *)job  
  10. {  
  11.   
  12.     objc_setAssociatedObject(self, &key, job, OBJC_ASSOCIATION_COPY);  
  13. }  
  14.   
  15. -(NSString *)job  
  16. {  
  17.     return objc_getAssociatedObject(self, &key);  
  18. }  
  19.   
  20. @end   

 建立关联引用,将这个对象和我们所利用的唯一不变的地址进行关联,而关联则是job属性,这样的话由于建立关联的对象存在,所进行关联的键唯一,所以我们的属性也被唯一保存了,如同保存在对象自身上一样。



内容概要:本文系统阐述了Java Persistence API(JPA)的核心概念、技术架构、核心组件及实践应用,重点介绍了JPA作为Java官方定义的对象关系映射(ORM)规范,如何通过实体类、EntityManager、JPQL和persistence.xml配置文件实现Java对象与数据库表之间的映射与操作。文章详细说明了JPA解决的传统JDBC开发痛点,如代码冗余、对象映射繁琐、跨数据库兼容性差等问题,并解析了JPA与Hibernate、EclipseLink等实现框架的关系。同时提供了基于Hibernate和MySQL的完整实践案例,涵盖Maven依赖配置、实体类定义、CRUD操作实现等关键步骤,并列举了常用JPA注解及其用途。最后总结了JPA的标准化优势、开发效率提升能力及在Spring生态中的延伸应用。 适合人群:具备一定Java基础,熟悉基本数据库操作,工作1-3年的后端开发人员或正在学习ORM技术的中级开发者。 使用场景及目标:①理解JPA作为ORM规范的核心原理与组件协作机制;②掌握基于JPA+Hibernate进行数据库操作的开发流程;③为技术选型、团队培训或向Spring Data JPA过渡提供理论与实践基础。 阅读建议:此资源以理论结合实践的方式讲解JPA,建议读者在学习过程中同步搭建环境,动手实现文中示例代码,重点关注EntityManager的使用、JPQL语法特点以及注解配置规则,从而深入理解JPA的设计思想与工程价值。
先看效果: https://pan.quark.cn/s/d787a05b82eb 西门子SCALANCE X系列交换机是西门子公司所提供的工业以太网交换机产品系列,其在工业自动化领域具有广泛的应用。 如果在应用期间遭遇固件升级失误或采用了不相容的固件版本,可能会导致交换机无法正常启动。 在这种情况下,通常能够借助FTP(文件传输协议)来恢复交换机的固件,从而使其恢复正常运作。 本文件详细阐述了利用FTP修复SCALANCE X系列交换机固件的方法,并具体说明了实施步骤。 当SCALANCE X系列交换机的固件出现故障时,设备在启动后会自动激活引导加载程序,并通过故障LED的闪烁来表明设备处于特殊情形。 在这种情形下,交换机能够充当FTP服务器,与客户端建立联系,执行固件数据的传输。 需要特别强调的是,对于SCALANCE X200系列交换机,必须经由端口1来连接FTP客户端。 在实施步骤方面,首先需要为交换机指定一个IP地址。 这一步骤通常借助西门子公司提供的PST(Product Support Tools)软件来实施。 在成功配置IP地址之后,就可以通过FTP协议与交换机内部的FTP服务器建立连接,并借助FTP客户端将固件文件传输到交换机。 需要留意的是,在传输固件文件之前,应当先从西门子技术支持网站获取对应订货号的固件版本文件。 一旦固件文件备妥,就可以开始FTP操作。 这通常涉及打开操作系统的DOS窗口,运用FTP指令连接到交换机的FTP服务器,并输入正确的用户名和密码进行身份验证。 在本案例中,用户名和密码均为“siemens”,并且传输模式设定为二进制。 随后,使用FTP的“put”指令将本地固件文件上传至交换机。 值得留意的是,固件文件名必须严格遵循大小写规则。 上传成功后,...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值