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

objc从外部调用祖父母方法

objc是Objective-C的缩写,是一种面向对象的编程语言,主要用于开发iOS和macOS应用程序。在Objective-C中,可以通过消息传递的方式调用对象的方法。

在Objective-C中,可以通过super关键字来调用父类的方法。但是,如果要调用祖父母类的方法,需要通过objc_msgSendSuper函数来实现。objc_msgSendSuper函数会在当前类的父类中查找方法的实现,并调用该方法。

调用祖父母方法的步骤如下:

  1. 创建一个指向祖父母类的指针,可以使用objc_getClass函数获取祖父母类的类对象。
  2. 使用objc_msgSendSuper函数调用祖父母类的方法,需要传入祖父母类的指针、方法选择器和方法的参数。

调用祖父母方法的示例代码如下:

代码语言:txt
复制
// 获取祖父母类的类对象
Class grandparentClass = objc_getClass("GrandparentClassName");

// 调用祖父母类的方法
objc_msgSendSuper(&self, @selector(grandparentMethod), arg1, arg2);

在这个示例中,"GrandparentClassName"需要替换为实际的祖父母类名,"grandparentMethod"需要替换为实际的祖父母类方法名,arg1和arg2是方法的参数。

objc_msgSendSuper函数的调用会在运行时动态查找祖父母类的方法实现,并执行该方法。这样可以实现从外部调用祖父母类的方法。

需要注意的是,调用祖父母方法可能会导致代码的可读性和维护性降低,因为这种方式破坏了继承关系的封装性。在实际开发中,应该谨慎使用这种方式,并考虑其他设计模式来解决问题。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云计算服务:https://cloud.tencent.com/product
  • 腾讯云数据库:https://cloud.tencent.com/product/cdb
  • 腾讯云服务器:https://cloud.tencent.com/product/cvm
  • 腾讯云人工智能:https://cloud.tencent.com/product/ai
  • 腾讯云物联网:https://cloud.tencent.com/product/iot
  • 腾讯云移动开发:https://cloud.tencent.com/product/mobdev
  • 腾讯云存储:https://cloud.tencent.com/product/cos
  • 腾讯云区块链:https://cloud.tencent.com/product/baas
  • 腾讯云元宇宙:https://cloud.tencent.com/product/mu
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

记录——JAVA动态加载外部JAR,并调用方法以及卸载关闭打开的外部JAR

正文 最近在工作当中需要通过JAVA代码去调用外部JAR里面的方法,而不是直接在项目当中直接引入对应的JAR。记录一下实现过程当中遇到的问题和具体实现的代码。...jar失败:"+e.getMessage()); } } } } 到这里就实现了对外部jar的加载和调用以及关闭。...注意事项 外部jar的路径需要用file开头 loadClass是输入类所在的package路径 如果不调用urlClassLoader.close()这个方法关闭外部jar的话,外部jar会一直呈现占用状态...上述方法是不能调用外部jar里面的mian方法的,代码中调用外部jar里面的main方法可以通过RunTime类执行 java -jar xxx.jar命令进行调用。...---- 标题:记录——JAVA动态加载外部JAR,并调用方法以及卸载关闭打开的外部JAR 作者:海加尔金鹰 地址:https://www.hjljy.cn/articles/2019/10/16

10K20

Spring杂谈 | 桥接方法到JVM方法调用

,编译器会自动为我生成桥接方法,因为编译的后文件是交由JVM执行的,生成的这个桥接方法肯定就是为了JVM进行方法调用时服务的,我们不妨大胆猜测,在这种情况下,是因为JVM在进行方法调用时,没有办法满足我们的运行时多态...要弄清楚这个问题,我们还是要从JVM的方法调用说起。 JVM是怎么调用方法的? 我们应该知道,JVM要执行一个方法时必定需要先找到那个方法,对计算机而言,就是要定位到方法所在的内存地址。...因为目前我们关注的是方法调用,所以对class文件的具体结构我们就不做过多分析了,我们主要就看看常量池跟方法表。...调用了那个被桥接的方法,也就是我们真正定义的重写的方法 2: invokevirtual #3 // Method get:(Ljava/lang/Number...桥接方法到底桥接的什么?其实就是编译器对JVM到JAVA的一个桥接,编译器为了满足JAVA的重写的语义,生成了一个方法描述符与父类一致的方法,然后又调用了真实的我们定义的逻辑。

1.5K20

没想到吧,PHP 中在类的外部也可以调用私有方法

一般来说,在 Class 的外部是无法调用私有方法,这也是 Private 字面的意思,但是一些很特殊很特殊的情况下,如果需要调用,是否可以呢?其实可以使用类的反射来实现。...reflection->getClosure($object); } return call_user_func_array($callback, $args); } 简单解释一下,首先还是简单判断该方法是否存在...,接着获取对象方法的放射,然后判断一下是不是公共的方法,如果是公共就正常调用,不是则获取其闭包,最后使用回调的方式来调用。...这个函数可以让你调用对象的私有或者受保护方法,建议一些特殊的情况下才使用。为了方便大家调用,新版的 WPJAM Basic 也会集成该函数。----

1K30

Spring AOP不拦截对象内部调用方法原因

外部调用被拦截bean的拦截方法时,可以选择在拦截之前或者之后等条件执行拦截方法之外的逻辑,比如特殊权限验证,参数修正等操作。   但是最近在项目中要在一个事务中跨数据源进行操作。...这里出现的问题就是,如果我们要拦截某个类的多个方法,且在该类的方法中使用this调用要拦截的方法时会导致拦截失败。...public class AopDemo+其他名称 { /** * controller层调用的逻辑service方法,该方法内部调用分别访问不同数据库的service方法...,所以这就是为什么内部调用方法无法拦截的原因。...我们可能会想,在外部调用两次beanA,第一次调用method1,第二次调用method2,这样做可以解决问题,但是这样的直接后果是我们的逻辑代码将变得紊乱,并非所有的场景下都可以通过这样的设计来完成。

2.5K10

【Kotlin】Kotlin 类的继承 三 ( super 关键字使用 | super@ 外部调用父类方法 | 子类选择性调用 父类 接口 方法 super )

子类调用父类总结 II . 子类调用父类方法 ( super ) III . 子类内部类调用父类方法 ( super@ ) IV ....子类重写父类方法 : 如果属性 或 方法被子类重写了 , 那么就需要使用 super 关键字调用父类属性或方法 ; 4 . super 关键字调用需要考虑的情况 : ① 常用情况 : 最常用的情况只使用...super 关键字进行简单调用即可 ; ② 子类内部类调用父类 : 如果想要在子类的内部调用父类的成员和方法 , 需要使用 super@子类名称 调用 ; ③ 子类调用不同父类的同名方法 : 如果子类继承的父类...子类调用父类方法 ( super ) ---- 子类调用父类方法 : 子类中可以通过 super 调用父类的方法 , 包括普通方法 , 和属性访问的 setter 方法 ; 其中的 super 相当于父类对象的引用...子类内部类调用父类方法 ( super@ ) ---- 子类内部类调用父类方法 : 在子类的内部类中 , 如果想要访问父类的方法 , 可以使用 super@子类名称.父类方法() 的形式 , 调用父类的方法

1.3K10

静态拦截iOS对象方法调用的简易实现

统计OC对象的方法调用可以在运行时通过第三方库比如fishhook来Hook所有objc_msgSend调用来实现,也可以在编译后链接前通过静态插桩的方式来实现Hook拦截。...本文所介绍的是第三种静态Hook方案,也是依赖于静态库这个前提来实现对objc_msgSend函数进行Hook,从而实现在编译前链接后的OC对象方法调用插桩。 这个方案实现的原理很简单。...因为静态库其实只是一个编译阶段的中间产物,静态库目标文件中的所有引用的外部符号会保存到一张字符串表中,所有函数调用都只是记录了函数名称在字符串表的索引位置,在链接时会才会根据符号名称来替换为真实的函数调用指令...无论用何种方法实现,你都需要首先了解一下静态库.a的文件结构。你可以:《深入iOS系统底层之静态库》一文中掌握到一个静态库文件的组成结构。...---- 采用本文中所介绍的静态Hook方法的好处是我们不必Hook所有的OC方法调用,而是可以有选择的进行特定对象和类的方法调用拦截。

1.8K30

Mach-O相关概念

保存OC里面方法名 __objc_classname 保存OC类的名字 __objc_methtype 保存ObOCjc类的一些信息(函数签名) __objc_classlist OC的类列表...在ObjC中,类继承关系以及protocol等是non-lazy的,启动时就需要开始绑定,而在函数里的调用外部函数等等都是lazy binding的,在第一次调用时才会进行绑定。...ObjC Runtime__DATA段中获取ObjC类信息,由于ObjC是动态语言,可以通过类名获取其实例,所以Runtime维护了一个映射所有类的全局类名表。...Initializers 通过 ObjC Runtime 在 dyld 注册的通知,当 Mach-O 镜像准备完毕后,dyld 会回调到 ObjC 中执行 +load 方法,包括以下步骤: (1)获取所有...(3)对待加载列表中的类进行方法判断并调用 +load 方法。 执行 C/C++ 初始化构造器,如通过 attribute((constructor)) 注解的函数。

90510

AutoreleasePool的那些事

; }; 复制代码 因为是C++代码,所以可以看出这个结构体构造函数会调用objc_autoreleasePoolPush(),析构函数会调用objc_autoreleasePoolPop();,所以main...objc_autoreleasePoolPop(void *ctxt) { AutoreleasePoolPage::pop(ctxt); } 复制代码 可以看到这两个方法只是调用了AutoreleasePoolPage...objc_retainAutoreleasedReturnValue,如果是,就知道了外部是ARC环境,反之就走没被优化的老逻辑。...简单的可以理解为,由objc_autoreleaseReturnValue将对象放入tls(Thread Local Storage);而外部objc_retainAutoreleasedReturnValue...那也就是说ARC下只要调用方和被调方都用ARC编译时,所建立的对象都不加入autoreleasepool.更简单的说我们自己写的类,调用工厂方法生成对象都不会放 入autoreleasepool.

28620

Swift编译之SIL(Swift Intermediate Language)

SILGen: AST 生成 raw SIL。 IRGen: canonical SIL 生成 IR。 LLVM:LLVM Backend 从优化后的 IR 生成汇编代码或者目标代码。...br lable:将控制权当前块转移到其他块,并将进行传值。 $:类型标识。 %number:寄存器。 @方法名:某个方法的名字。 @_hasStorage:存储属性。...// sil hidden:表示这个modify方法是隐藏的,即不对外部可见 // @main.Person.name.modify:指明这个modify方法是Person类的name属性的modify...方法 // : Swift.String:指定modify方法的返回类型是Swift.String,这表示modify方法返回属性的当前值 // : $@yield_once:指定了modify方法调用约定...// -> ():表示函数的返回类型为空元组,即函数不返回任何值 // : $@convention(method):这部分指定了函数的调用约定,表明这是一个方法,在Swift中,方法调用与函数调用有一些不同之处

23741

iOS App启动过程

主要包括两部分 Rebase 修正内部(指向当前mach-o文件)的指针指向 Bind 修正外部指针指向 ?...Rebase解决了内部的符号引用问题,而外部的符号引用则是由Bind解决。在解决Bind的时候,是根据字符串匹配的方式查找符号表,所以这个过程相对于Rebase来说是略慢的。...ObjC 在加载时可以通过 fix-up 在动态类中改变实例变量的偏移量,利用这个技术可以在不改变dylib的情况下添加另一个 dylib 中类的方法,而非常见的通过定义类别(Category)的方式改变一个类的方法...初始化需要做的事情包括: 调用 Objc 类的 + load 函数 调用 C++ 中带有 constructor 标记的函数 非基本类型的 C++ 静态全局变量的创建 所谓执行监控启动crash的思路都是在这里构建的...下面是一些方法的执行顺序,initialize的顺序可能在更早,但总是会在load和launch之间。 程序启动逻辑 最后 dyld 会调用 main() 函数。

2.1K30

iOS 知识点回顾(一)

+load方法和+initialize方法 +load方法 +initialize方法 8. Block block本质上是封装了函数调用以及函数调用环境的OC对象,它内部也有个isa指针。...为了保证block内部能够正常访问外部的变量,block有个变量捕获机制 block的变量捕获(capture) 3种block类型 block的类型 各个类型的Block使用场景 _ _block修饰符...weak释放为nil的过程: 1、调用objc_release 2、因为对象的引用计数为0,所以执行dealloc 3、在dealloc中,调用了_objc_rootDealloc函数 4、在_...objc_rootDealloc中,调用了object_dispose函数 5、调用objc_destructInstance 6、最后调用objc_clear_deallocating: 1、...weak表中获取废弃对象的地址为键值的记录 2、将包含在记录中的所有附有 weak修饰符变量的地址,赋值为nil 3、将weak表中该记录删除 4、引用计数表中删除废弃对象的地址为键值的记录

61030

RavenDB建模--常见建模方案

Child 文档遍历到 Parent 文档时可以使用 Id 来进行查找,一般来说我们为了加快速度,会使用 ​Include​ 来保证一次远程调用加载所有文档,这样也不会影响到使用数据模型。...说我们有三种方法: 在 Child 文档中添加一个数组,数组中存储祖父母辈的文档 ID; 在祖父母辈的文档中添加一个数组,数组中存储孙子辈的文档ID; 两者相互存储。 那么到底哪种方法更好呢?...一般来说我们会将关联记录放在较小的一侧,也就是说孩子祖父母辈的数量大部分情况下比祖父母的孙子辈的数量少,因此将这个关联放在 Child 文档中。...当我们孙子辈遍历数据时,只需要包含并加载祖父母辈就行了,代码如下: using (var session = store.OpenSession()) { Child c = session...Dictionary gradparents = session.Load(c.Grandparents); } 祖父母辈查询时我们可以这么做

50410

关于 Block 中捕获 self 的分析

self,重定义的self只对显式的访问有效,所以那就是说C++方法有问题喽?...,一个是self,一个是cmd,下面是调用testBlock方法之前的初始化部分 push {r4, r5, r6, r7, lr} add r7, sp, #12 sub sp, #60...block在创建的时候一开始是放在栈上的,调用了最后的_objc_retainBlock后才会拷贝到堆上,block本质就是一个结构体,布局如下图,当需要捕获外部变量的时候会把捕获的变量放到结构体内,..._objc_retain方法,这个方法会将r0指向的对象引用计数+1,然后随即将这个对象的地址存放到栈偏移36的地方,这里应该就是强引用self的部分了,证据找到了!...可以看到这时没有objc_retain只执行了objc_copyWeak,所以不加self会导致额外的retain即强持有self 最后的最后看一下block调用的反编译结果 int ___19-[KDTest

86550
领券