利用Objective-C分类对“私有成员,方法”的静态动态实现

Objective-C 的“多继承” Objective-C 的“多继承” 当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承。多继承是从多余一个直接基类派生类的能力,可以更加直接地为应用程序建模。但是Objective-C不支持多继承,由于消息机制名字查找发生在运行时而非编译时,很难解决多个基类可能导致的二义性问题。不过其实 Objective-C 也无需支持多继承,我们可以找到如下几种间接实现多继承目的的方法:消息转 阅读详情

分类


分类(category)是OBJ-C语法中非常方便的一部分,可以在运行时向某个现有类添加新的方法。包括Cocoa框架中的任何类,我们都可以对其进行扩展,这是从Smalltalk(oc的鼻祖)继承过来的,跟C#中的扩展方法比较像。

不谈历史,先来看下用分类进行私有成员的表现。

#import "ViewController.h"

@interface ViewController ()
{
    UIButton *button1;
}

@end

比如这里在.m文件,ViewController的上面有一个匿名的分类(类的扩展),这里声明的变量都属于我们的“私有成员”,对外属于隐藏状态。


这样,我们可以进行更多元化的定义,比如“公有可读,私有读写”。

.h文件中声明一个状态属性

@property (nonatomic, readonly) BOOL viewState;


然后在.m文件的匿名分类中对其声明为readwrite, 便可以进行读写操作了。


@interface ViewController ()
{
    UIButton *button1;
}

@property (nonatomic, readwrite) BOOL viewState;

@end

@implementation ViewController

- (void)setViewState:(BOOL)viewState
{
    code...
    return ;
}

- (BOOL)viewState
{
    code...
    return ;
}

于是,对属性信息的封装便完成了。


添加“成员”的动态实现


利用Runtime可以很好的在分类中添加属性,甚至对其进行设值取值。
这里我已有一个Person类,我想对其增加一个Address分类,并在分类中声明一个属性Address。

@interface Person (Address)

@property (nonatomic, strong) NSString *address;

@end

这样,我就必须对其进行设值取值了,嗯,但是它只是一个分类声明的属性,并不是成员。

于是代码可能就变成了下面这样

- (NSString *)address
{
    return self.address;
}

= =于是,我们找到了更好的方法,就是利用runtime的关联引用

static char KPersonAddressKey;
//setter
- (void)setAddress:(NSString *)address
{
    objc_setAssociatedObject(self, &KPersonAddressKey, address, OBJC_ASSOCIATION_COPY);
}
//getter
- (NSString *)address
{
    return objc_getAssociatedObject(self, &KPersonAddressKey);
}

下面对其进行了测试

        Person *p = [[Person alloc] init];
        p.address = @"Tianjin University";
        
        NSLog(@"%@", p.address);

打印结果
2013-08-09 00:41:43.033 CatagoryTest[788:303] Tianjin University

那,有没有私有方法呢。。。


有很多使用类的扩展来写私有方法的例子,这些都能够混过编译器进行调用,虽然编译器不会提示,但是还是会从类中找到那个方法并进行调用。

这主要得益于OC的Runtime特性,他的消息转发机制让很多事情都成为了可能,实现的同时甚至还提升了性能。
有时我们也管其叫“蹦床”,讲一个消息从一个对象弹到另一个对象。这种技术允许一个代理对象把消息转移到另一个线程,缓存结果,合并重复消息甚至其他中间的配置。

实现主要使用对 methodSignatureForSelector:以及forwadInvocation:的方法的覆写。

这里大家也可以参见念茜的博客Objective-C 的“多继承”



以上为全部内容,欢迎指正和扩充。

利用Objective-C的反射机制和运行时特性实现类静态方法的动态访问(一) 利用Objective-C的反射机制和运行时特性实现类静态方法的动态访问,解决不能使用NSObject类的反射方法 performSelector 访问静态方法的坑爹问题! 阅读详情

相关推荐

为什么Objective-C的对象“调用方法”叫做发消息。

Objective-C与C++,java等面向对象的语言类似,但是在使用Objective-C的类创建对象,并且这个对象“调用自身类的方法的时候”,我们叫做给对象发送一个消息,而不是调用方法,这就是Objective-C和C++不同的关键所在,因为该语言使用“消息结构”(message structure)而非“函数调用”(function calling)。消息和函数的区别,像下面一样。

u012173710的专栏 2825

Objective C定义私有方法

我们有时会遇到,希望某个类的方法不能被它的继承类所继承。这在C++是很好实现,直接将该方法定义为private即可。但是在正规的OC语法,你不能对一个类的方法定义为private,那么如何实现这种功能呢?        上帝给你关上一道门,同时给你打开一扇窗。OC同样也是如此,当OC不能将类定义为私有时,还提供了另外一种方法:类别,在现有类的基础上添加新方法的方式。下面用代码来具体实现私有方法。

Kikim的地盘 7117

ObjC为什么能实现动态消息传递?早期的ObjC编译器如何实现的?ObjC和C语言?Objective-C?Objective-C 1.0和2.0有什么区别?

乍看ObjC的消息传递,和普通函数调用没什么区别。Objective-C 利用了其运行时系统(Runtime System)来实现动态消息传递。运行时系统是 Objective-C 的一部分,它允许在运行时动态地添加、修改和查询类和对象。运行时系统提供了动态查找方法实现的能力,当一个对象接收到一个消息时,运行时系统会查找该对象的方法列表,以确定是否有匹配的方法。

编程语言开发、框架原理、编程思想、最佳实践技巧经验分享。致力于各种编程技术的技巧经验干货分享,讲解开发避坑技巧,追踪开发前沿技术,实战展开解决难题。 程序员小迷助您在编程路上越走越好! 976

objective-c 的私有方法

接口定义: [code="c"]#import @interface Fraction: NSObject{ int numerator; int denominator; } -(void) print; -(void) setNumerator:(int) n; -(void) setDenominator:(int) d; -(int) numerator; -(i...

zimo888的专栏 255

深入解析Objective-C运行时系统

Objective-C作为苹果开发平台的核心语言,其运行时系统(Runtime System)是其灵魂所在。它是一个小巧但功能强大的C语言库,支持动态类型、消息传递、内存管理等面向对象特性。运行时系统的工作不仅仅局限于应用的编译期,它还延续到应用的运行期,使得Objective-C拥有比静态语言更多的灵活性。Objective-C的runtime API是一组底层C语言接口,允许开发者在运行时检查、修改类和对象的行为。

weixin_33298352的博客 609

深度学习初探 - 入门 DL 主流框架

这个课程主要是引导大家入门TensorFlow、Theano、Keras 及 Caffe 几个主流的深度学习框架。在课程中有关各种算法的详细推导及思想我们不会做过多的陈诉,旨在通过让同学们动手操作搭建自己的神经网络模型,了解如何使用这些框架解决实际问题。课程会基于每个框架的官方文档,先带大家熟悉框架中基本的定义语法及常用函数(可看成深度模型的小零件),每个实验最后都会综合这些零件搭建一个简易的神经深度网络模型。这个项目十分适合具有一定python编程基础,对人工智能、深度学习感兴趣的同学。Theano。

2401_86435672的博客 1234

Objective-C 私有方法

一、关于Objective-C私有方法: 下面是网上一博主的部分内容: 在面向对象的开发中,一个很重要的原则就是不要暴露不需要暴露的东西。 在Objective-C中,在头文件中你只能声明类方法和实例方法,这意味着你所有的方法都要暴露在外边。 其实在Objective-C中也可以来声明一个私有方法,这个方法只有本类可见,其他任何类都看不到,即使是继承于这个类的其他子类...

weixin_33909059的博客 266

攻克JESD204B多ADC同步:从时钟对齐到数据对齐的实战解析

本文深入解析了JESD204B多ADC同步的系统性挑战与实战解决方案。从确保设备时钟同源、精确捕获SYSREF信号,到管理接收端弹性缓冲区与释放点,文章提供了从时钟对齐到数据对齐的完整调试路径与排查清单,是攻克高速数据采集系统中多片ADC同步难题的实用指南。

weixin_29231725的博客 197

关于Objective-c 中私有方法的几点总结

严格说来,OC中不存在真正的私有方法的概念;而所谓私有,只是通过某些手段,达到私有的效果而已。其实,在ARC机制之前,私有方法是可以通过强制来实现调用的(所以说不存在真正的私有);在ARC机制下,如果强制调用执行,则会出现报错。下面讨论下在OC中实现方法私有的几种手段。 第一种,常用的方法,个人认为也是最简单的方式(即,只在类中.m文件中实现,不在.h文件中声明) {优快云:CODE:7616

咖的夫的博客 386

S4 Hana SD -信贷管理 - 03

自动信用控制将针对同一信用控制范围的不同的客户风险类别和信贷组执行不同的信用控制政策。对于ECC系统而言,无需单独设置检查规则,可在自动信贷控制进行设置即可,如图1-5-2。在S4 HANA版本中,自动信贷控制和检查规则是分离的。S4系统需要在定义自动信贷控制的时候,给字段“SAP信用管理”打钩,激活检查规则,然后需要单独在检查规则页签设置检查规则。接下来,我们分别介绍ECC和S4 HANA系统中两种不同配置方式.6.2SPRO。

weixin_46525734的博客 2888

【Codecs系列】x265编码器(十二):子像素运动搜索

在基于块运动补偿的视频编码框架中,运动搜索是最为重要的环节之一,同时也是编码端最为耗时的模块。运动搜索包括整像素运动搜索和子像素运动搜索,其中整像素运动搜索已经有很多快速算法,比如经典的三步搜索法、菱形搜索、六边形搜索以及TZSearch等等;但子像素搜索的快速算法却比较少,本文主要讲解x265编码器中的子像素搜索方法以及相关的快速搜索方法。

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 748

Objective-C static 类方法

1,与c++ java不同,oc语法是不支持类的静态变量的。static只能修饰局部变量、全局变量和函数,用类方法代替了静态方法。 类方法就是类的静态方法,直接使用类名调用,类方法中是不能访问类的成员变量的。因为静态方法是不能够操作成员变量的。 static修饰局部变量表示将该局部变量存储到静态存储区;修饰全局变量用于限制该全局变量只能在当前文件中访问;修饰函数用于限制该函数只能在当前

码出精彩 2589

【机器人技术基础】MATLAB Robotics Toolbox PUMA560 运动学正逆解

机器人技术基础实验2报告 1. 实验目的和要求 2. 实验手段 2.1 实验原理 2.2 函数详解 3. 实验主要内容 4. 实验结果和分析 4.1 正运动学求解 例1 例2 4.2 逆运动学求解 例1 例2 1. 实验目的和要求 掌握常见形式的机器人的D-H坐标系建立方法、运动学建模; 正逆运动学分析与求解; 使用Robotics Toolbox对直角坐标机器人、圆柱坐标机器人、球坐标机器人、PUMA560其中之一建立运动学模型,正逆求解和仿真。 2. 实验手段 2.1

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

objective-c调用静态库

一.基本知识在实际的编程过程中,通常会把一些公用函数制成函数库,供其它程序使用,一则提搞了代码的复用;二则提搞了核心技术的保密程度。所以在实际的项目开发中,经常会使用到函数库,函数库分为静态库和动态库两种。和多数人所熟悉的动态语言和静态语言一样,这里的所谓静态和动态是相对编译期和

handnotes的专栏 3637

MATLAB基础应用精讲-【数模应用】PPO算法(附python代码实现)(二)

表示为状态转移概率和动作选择概率的乘积,因为状态和动作决定轨迹。

qq_36130719的博客 413

购物车智能检测系统:YOLO26 + PyQt5 毕设实现

YOLO26 + PyQt5 完成购物车商品检测系统:标注数据集(OpenImages 筛选 + 自制 500 张),训练 100 epoch 得到 mAP50 约 0.89,集成商品定价后输出总价。建议先用 OpenImages 预训练权重在自制数据上调优(冻住 backbone 前 50 epoch),等 loss 稳定后再解冻全量训练。

m0_64661770的博客 55

Objective-C是动态运行时语言的个人理解

以前开发时没有特别注意这些细节问题,今天突然被问到,一下子懵圈了,经过一番查找和比较,再加上小编的理解终于是了解的差不多了,现在分享给大家! 1、什么是动态语言? 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C

MingGe0107的博客 4707

【图像超分】论文复现:Pytorch实现ESPCN

论文精读:由于ESPCN没有公布源码,我们选择github上一个高star的项目来复现。准备数据集,以及数据预处理搭建网络模型设置参数并训练测试训练好的模型用训练好的模型测试自己的数据本文我们使用pycharm链接服务器训练。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1万+

剖析 Objective-C 类的方法派发:静态派发与动态派发的底层原理

动态派发机制是 Objective-C 面向对象特性的基石,其灵活性与运行时决策能力支撑了 KVO、动态类型等核心功能,但也需注意避免过度深层次继承带来的性能损耗。

2501_93878622的博客 373

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

objective-c 动态语言,Objective-C是动态语言吗,为什么?

态、动态是相对的,动态语言就是“动态类型语言”的缩写,这里动态语言指的是不需要在编译时确定所有的东西,运行时可以改变类型的定义的都可以算是动态语言。Objective-C 可以通过Runtime 这个运行时机制,在运行时动态的添加变量、方法、类等,所以说Objective-C 是一门动态的语言其他说法Objective-C 是C 的超集,在C 语言的基础上添加了面向对象特性,并且利用Runtime...

weixin_39856208的博客 209

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Objective-C动态特性

⚠️注意:动态类型语言和动态语言是完全不同的两个概念。前者关注数据类型,而后者关注代码结构。首先,OC 是动态语言,因为 OC 通过可以通过动态绑定改变自身结构。其次 OC 将数据类型的确定由编译时,推迟到了运行时。关于类型检查,一般会把类型分为两类:动态的和静态的,分别对应动态类型语言和静态类型语言。静态类型:静态类型在编译时做检查。当在代码中使用 ARC 时,编译器在编译期间,会做许多的类型检查:因为编译器需要知道哪个对象该如何使用。例如,如果 myObject 没有 hello 方法,那么就不能写如下

u013306324的博客 422

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Objective-C中静态数组和动态数组的创建及常用方法

一、静态数组(NSArray) 1.静态数组(NSArray) 数组的内容不可以进行改变,并且在OC中数组只能存放对象类型不能存放C语言的基本数据类型OC的数组可以存放多种对象类型的数据例如[@"dfa", @2, pxd, cc, shuzu],但是不能存NSNull的数据,因为遇到它就不会再检索数组以后的元素。 2.静态数组(NSArray)的创建方法 NSArray *array...

xutaoshuaiqi的博客 4666

Objective-C 是动态语言

Objective-C 的动态性是由 runtime 相关的库赋予的。   当然其他语言也完全可以运行在一个 Runtime 库上而获得动态性,由于多数高级语言的诞生都对应着一种编译器,因此将编译器的特性概括进语言里讲,也不是不可以。 http://www.cocoachina.com/ios/20161107/17974.html https://blog.csdn...

diaoju3333的博客 137

objective-c 动态语言,Objective-C 语言的动态性

编译时与运行时编译时: 即编译器对语言的编译阶段,编译时只是对语言进行最基本的检查报错,包括词法分析、语法分析等等,将程序代码翻译成计算机能够识别的语言(例如汇编等),编译通过并不意味着程序就可以成功运行。运行时: 即程序通过了编译这一关之后编译好的代码被装载到内存中跑起来的阶段,这个时候会具体对类型进行检查,而不仅仅是对代码的简单扫描分析,此时若出错程序会崩溃。可以说编译时是一个静态的阶段,类型...

weixin_35829704的博客 223

Building Objective-C static libraries with categories

Q: How do I fix "selector not recognized" runtime exceptions when trying to use category methods from a static library? 如何解决 在 runtime 环境中尝试调用静态库中分类的方法时,报 "selector not recognized" 异常?   今天在浏览 ...

weixin_30613433的博客 758
上一篇: 解决Keyboard遮盖输入的几种办法
下一篇: 再谈内存管理与ARC运行机制——内存管理
RannieR
博客等级 码龄14年 180粉丝 68原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值