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

如果两个ObjC类别覆盖相同的方法会发生什么?

如果两个ObjC类别覆盖相同的方法,会发生方法覆盖(method overriding)的情况。方法覆盖是指在继承关系中,子类重新定义了父类中已经存在的方法,从而改变了该方法的实现逻辑。

当两个ObjC类别覆盖相同的方法时,会根据调用对象的实际类型来确定调用哪个方法。如果调用对象是子类的实例,那么子类中覆盖的方法会被调用;如果调用对象是父类的实例,那么父类中的方法会被调用。

方法覆盖可以实现多态性,即通过相同的方法名实现不同的行为。这样可以提高代码的灵活性和可扩展性。

在ObjC中,类别(Category)是一种扩展现有类的方式,可以为已有的类添加新的方法,包括覆盖已有方法。类别的优势在于可以在不修改原始类的情况下扩展其功能。

应用场景:

  • 当需要为已有的类添加新的方法或覆盖已有方法时,可以使用类别来实现。
  • 当需要为某个类的实例添加特定的行为时,可以使用类别来实现。

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

腾讯云提供了丰富的云计算产品和服务,以下是其中一些与开发相关的产品:

  1. 云服务器(CVM):提供可扩展的云服务器实例,支持多种操作系统和应用场景。详细信息请参考:https://cloud.tencent.com/product/cvm
  2. 云数据库 MySQL 版(CDB):提供高性能、可扩展的云数据库服务,支持自动备份、容灾等功能。详细信息请参考:https://cloud.tencent.com/product/cdb
  3. 人工智能平台(AI Lab):提供丰富的人工智能开发工具和服务,包括图像识别、语音识别、自然语言处理等。详细信息请参考:https://cloud.tencent.com/product/ailab
  4. 云存储(COS):提供安全可靠的对象存储服务,适用于存储和处理各种类型的数据。详细信息请参考:https://cloud.tencent.com/product/cos

请注意,以上仅为腾讯云的部分产品示例,更多产品和服务请参考腾讯云官方网站。

相关搜索:如果两个内核模块导出相同的符号会发生什么如果我用异步覆盖一个抽象的void方法,会发生什么?如果我的类符合两个具有相同属性的协议,会发生什么?覆盖两个列表并指出插入发生的位置的最佳方法JUnit 5使用相同的@Order(#)测试方法会发生什么?如果我在派生类中有相同的函数原型,会发生什么?为什么保证金会覆盖Android中的marginLeft(与radius等相同)?为什么我的两个单独的Vue组件会覆盖彼此的数据?比较两个数组是否相同的最快方法是什么?如果两个方法的名称相同,如何从使用该特征的类方法中调用特征方法?如果截取的方法调用另一个截取的方法,会发生什么情况?如果我尝试使用SetObject,而我已经拥有相同的密钥,会发生什么情况?如果没有发生什么事情,那么会触发的计时器叫什么名字?如果初始化方法的参数没有在类中声明,会发生什么?如果我在不同的布局中为几个小部件使用相同的ID,会发生什么?如果它们的请求urls是相同的,为什么NGINX会以不同的方式处理请求?比较两个相同长度的int数组的最佳方法是什么?为什么在这个方法中声明这个变量会覆盖我的类成员(C++)?当两个列表的长度相同时,为什么: dict()会减少列表的长度?‘两个方法具有相同的擦除,但都不会覆盖SkuDetailsResponseListener()中的另一个’方法冲突错误‘
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS_Extension、Category、load、initialize

二、Category 类别 定义: ​ Category(也叫:类别/分类/类目),无需继承即可为类新增方法和协议,不需要获取源代码。 ​...Category的名字不能重复,否则会报错 ​ 如果与原有类方法重名:在方法列表中Category的方法会排在类原有方法的前面,从而有“覆盖”了原类方法的错觉。...(会覆盖当前类的) 使用: ​ 如果想防止父类的initialize被调用多次,可以实现如下: + (void)initialize { if (self == [ClassName self])...; 如果继承体系太复杂会导致整个系统混乱难以维护。...为什么? ​ 写在load,程序启动加载类信息的时候调用,仅调用一次。如果写在initialize,可能会被调用多次,或者一次都没调用。

53900
  • OC中Runtime浅析

    当类方法被调用时,先会从本身查找类方法的实现,如果没有,元类会向他父类查找该方法。同时注意的是:元类(meteClass)也是类,它也是对象。...如果找到了根类还没找到,那么就是没有了,会转向一个拦截调用的方法,我们可以自己在拦截调用方法里面做一些处理。 如果没有在拦截调用里做处理,那么就会报错崩溃。 以上就是方法调用的过程。...我们可以看到的是,所谓重写父类方法,并不是抹除了父类方法,父类的方法还是存在的,只是我们在子类里面找到了就不会再去父类里找了,是这个层面的“覆盖”。...有两个相关的方法: objc_setAssociatedObject 方法用来给类关联一个属性; objc_getAssociatedObject 方法用来获取之前关联的属性。...的含义 当然,你也可以和类别一起用,创建两个方法用来关联和获取对象,比如下面这样: //添加关联对象 - (void)addAssociatedObject:(id)object{ objc_setAssociatedObject

    26820

    【IOS开发高级系列】Objective-c Runtime专题总结

    不同类中相同名字的方法所对应的方法选择器是相同的,即使方法名字相同而变量类型不同也会导致它们具有相同的方法选择器,于是OC中方法命名有时会带上参数类型(NSNumber一堆抽象工厂方法拿走不谢),Cocoa...只要方法名称相同,那么它们的ID就是相同的。         两个类之间,不管它们是父类与子类的关系,还是之间没有这种关系,只要方法名相同,那么它的SEL就是一样的。每一个方法都对应着一个SEL。...如果上面两个都过了,那就开始查找这个类的IMP,先从cache里面找,完了找得到就跳到对应的函数去执行。     4. 如果cache找不到就找一下方法分发表。...可能我们平时写代码时可能很少会考虑一句简单的[receiver message] 背后发生了什么,而只是当做方法或函数调用。...如果有两个类别实现了相同命名的方法,只有一个方法会被调用。

    38130

    iOS runtime探究(四): 从runtiem开始实践Category添加属性与黑魔法method swizzling你要知道的runtime都在这里

    关联对象 Associated Object 如果我们想为系统的类添加一个方法可以采用类别的方式进行扩展,相对来说比较简单,但如果要添加一个属性或称为成员变量,通常采用的方法就是继承,这样就比较繁琐了,...使用runtime的关联对象添加属性与我们自定义类时定义的属性其实是两个不同的概念,通过关联对象添加属性本质上是使用类别进行扩展,通过添加setter和getter方法从而在访问时可以使用点语法进行方法...,具体含义也与property修饰符相同,如果对property或property修饰符等有疑问可以查阅本系列教程第三篇文章从runtime开始: 理解OC的属性property或本博客另外两篇关于property...,如有需要可以查看相关文章,本文会介绍OC层面对方法的相关操作,同时会介绍method swizzling的方法。...,但是上面的例子好像并没有什么用,没有人会闲的没事去交换两个实例方法的实现。

    82860

    类方法load和initialize的区别

    通常情况下,我们在开发过程中可能不必关注这两个方法。如果有需要定制,我们可以在自定义的NSObject子类中给出这两个方法的实现,这样在类的加载和初始化过程中,自定义的方法可以得到调用。...补充上面一点,对于有依赖关系的两个库中,被依赖的类的+load会优先调用。但在一个库之内,父、子类、类别之间调用有顺序,不同类之间调用顺序是不确定的。...换言之,如果子类没有实现 +initialize 方法,那么继承自父类的实现会被调用;如果一个类的分类实现了 +initialize 方法,那么就会对这个类中的实现造成覆盖。...(本着除主动调用外,只会调用一次的原则,如果父类的+initialize方法调用过了,则不会再调用) 本类和Category的调用:Category中的+initialize方法会覆盖本类的方法,只执行一个...问题 问题: 子类、父类、分类中的相应方法什么时候会被调用? 需不需要在子类的实现中显式地调用父类的实现?

    2.4K40

    如何定位Obj-C野指针随机Crash(三):如何让Crash自报家门

    我们知道Obj-C的对象方法调用是通过objc_msgSend进行的,我们通过野指针访问一个对象的方法也一样,其实是通过objc_msgSend给已经释放的对象发了一条消息。...说起来有点像溢出攻击,利用shellcode覆盖函数返回值,一旦我们在出错的时候控制了CPU就可以获取更多异常信息,比如是哪个类,调了什么方法,对象的地址之类。...先解决几个关键问题: 1.覆盖成什么? 我们需要自己写一个类,用它的isa来替换已经释放的对象的isa。如果不出我们所料,我们用自己的类覆盖之后,之前调用的sel就换成了调用我们自己的类的某个sel。...再看看下面这几个让人头疼的传说中的全系统栈Crash,你是否熟悉? 栈1: ? 栈2: ? 上面这两个Crash如果不能重现几乎是无解!...这种情况建议还是提高测试的场景覆盖。 产生野指针和使用野指针的时间间隔太长:时间太长的话,很可能我们保留的指针已经被释放了。 APP内存消耗大,会降低曝光率。

    6.2K52

    如何定位Obj-C野指针随机Crash(三):加点黑科技让Crash自报家门

    我们知道Obj-C的对象方法调用是通过objc_msgSend进行的,我们通过野指针访问一个对象的方法也一样,其实是通过objc_msgSend给已经释放的对象发了一条消息。...说起来有点像溢出攻击,利用shellcode覆盖函数返回值,一旦我们在出错的时候控制了CPU就可以获取更多异常信息,比如是哪个类,调了什么方法,对象的地址之类。...先解决几个关键问题: 1.覆盖成什么? 我们需要自己写一个类,用它的isa来替换已经释放的对象的isa。如果不出我们所料,我们用自己的类覆盖之后,之前调用的sel就换成了调用我们自己的类的某个sel。...再看看下面这几个让人头疼的传说中的全系统栈Crash,你是否熟悉? 栈1: 栈2: 上面这两个Crash如果不能重现几乎是无解!...这种情况建议还是提高测试的场景覆盖。 产生野指针和使用野指针的时间间隔太长:时间太长的话,很可能我们保留的指针已经被释放了。 APP内存消耗大,会降低曝光率。

    98630

    Objective-C笔记

    因此本篇文章作为简单学习ObjC的记录,不会涉及太深入的语法特性,简而言之就是——够用就行。 什么是Objective-C Objective-C,简称OC,是一种通用、高级、面向对象的编程语言。...也就是说,一个类别不保证一定会回应收到的消息, 如果类别收到了一个无法处理的消息,程序只会抛出异常,不会出错或崩溃。...其实就是转换为: objc_msgSend(myClass, "add:secondNumber:", 3, 4) 所有的Objective-C方法调用都通过objc_msgSend进行调用,且实例和方法名称分别为前两个参数...冒号表明了参数的出现。 如果方法没有参数,你可以省略第一个(也是唯一的)方法标识关键字后面的冒号。本例中,这个方法有两个参数。...也就是说,如果子类定义了跟父类的具有相同标识符的方法,那么子类首先收到消息, 然后可以有选择的把消息转发(也可以不转发)给他的父类。 消息被中括号( [ 和 ] )包括。

    95740

    Objective-C Runtime编程指南(1)

    NSObject的这个方法的实现不知道这个类包含了什么,所以它返回一个字符串与对象的名字和地址。 NSObject的子类可以实现这个方法来返回更多的细节。...编译器会将一个下面的一个消息表达式 [receiver message] 转变成一个消息函数 objc_msgSend,这个函数将接收者和消息中提到的方法的名称(即方法selector)作为其两个主要参数...消息功能可以完成动态绑定所需的一切: 它首先找到selector引用的procedure,也就是方法实现。 由于相同的方法可以通过不同的类别来实现,所以它寻找的准确过程取决于receiver的类别。...如果在那里找不到selector,objc_msgSend将跟随指向超类的指针,并尝试在其派发表中找到selector。...一种方法是使你的类继承另一个类的方法。但是,这样安排事情可能是不可能的。可能有很好的理由,为什么你的类和实现negotiate的类是在继承层次结构的不同分支。

    82120

    iOS 开发:『Runtime』详解(二)Method Swizzling

    如果我们想要交换两个方法的实现,从而实现调用 - (void)originalFunction; 方法实际上调用的是 - (void)swizzledFunction; 方法,而调用 - (void)swizzledFunction...如果 + load 方法调用顺序为:父类 -> 子类 -> 父类类别 -> 子类类别,那么造成的影响就是调用子类的替换方法并不能正确调起父类分类的替换方法。...这样修改代码还是很多,如果所有页面不是一开始继承自定义的基类,那么就需要把所有页面的继承关系修改一下,同样会造成很多重复代码,和极大的工作量。...然后在 xxx_viewWillAppear: 中添加统计代码和调用xxx_viewWillAppear:实现; 因为两个方法发生了交换,所以最后实质是调用了 viewWillAppear: 方法。...那么加载占位图有没有什么好的方法或技巧? 第一种:刷新数据后进行判断 这应该是通常的做法。

    2K31

    iOS 小技能:Method Swizzling (交换方法的IMP)

    交换两个方法的实现一般写在分类的load方法里面,因为load方法会在程序运行前加载一次,而initialize方法会在类或者子类在 第一次使用的时候调用,当有分类的时候会调用多次。...main之前,并且不需要我们初始化,+load`方法是在类或者类别被加载到Objective-C时执行。...1.4 initialize +initialize本质为objc/_msgSend,如果子类没有实现initialize则会去父类查找,如果分类中实现,那么会覆盖主类,和runtime消息转发逻辑一样...,会覆盖本类的initialize方法 1.5 对象关联(动态添加实例变量) Since SELs are guaranteed to be unique and constant, you can use...因此如果要求B 调用dismiss方法,A要执行viewWillAppear:、viewDidAppear:这个两个方法,这个时候要把B的modalPresentationStyle设置为:UIModalPresentationFullScreen

    1.8K10

    ios Category

    ,那么category附加完成之后,类的方法列表里会有两个methodA 2)、category的方法被放到了新方法列表的前面,而原来类的方法被放到了新方法列表的后面,这也就是我们平常所说的category...的方法会“覆盖”掉原来类的同名方法,这是因为运行时在查找方法的时候是顺着方法列表的顺序查找的,它只要一找到对应名字的方法,就会罢休,殊不知后面可能还有一样名字的方法。...因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这个就是 Category 中不能添加实例变量的根本原因。 为什么使用Runtime又可以添加属性?...使用Runtime技术中的关联对象可以为类别添加属性。...load方法是什么时候调用的?load 方法能继承吗? Category中有load方法,load方法在程序启动装载类信息的时候就会调用。load方法可以继承。

    43210

    iOS Runtime 简单介绍,以及不同类的 Method Swizzling

    这里限定了 NSString 只不过是告诉编译器,请把 testObject 当做一个 NSString 来检查,如果后面调用了非 NSString 的方法,会产生警告。...typedef struct objc_ivar *Ivar; /// 类别 Category typedef struct objc_category *Category; /// 类中声明的属性...YES; } /** 这个方法会把你所调用的不存在的方法重定向到一个声明了该方法的类中,只需要你返回一个有该方法的 类就可以,如果你重定向的这个类仍然不具有该方法那么会继续崩溃 */ -(id...ViewController 的 category,另一个是 Tool 类,为了一会区别演示不同类 hook 的不同 (两个类中 hook 的代码完全一样) ViewController 中将要被替换的系统方法...下面再来看下如果我将替换方法写在不同类中会怎样,调用 Tool 中的交换方法 然后直接看结果了,因为代码都是一模一样的我直接复制过去的 发生了 crash,原因是 ViewController 中没有

    61130

    KVO详解及底层实现

    什么是KVO?? KVO就是NSKeyValueObserving,请看官方文档的解释: 大概翻译如下: 一种非正式协议,通知其他对象的指定属性发生了改变。...简单理解就是,可以监听一个对象的某个属性是否发生改变。 那么问题来了,什么是非正式协议??有正式协议吗?? 麻蛋,本来想找官方文档的,找了半天没找到。...从Stackoverflow找到了答案,貌似原来官方文档的链接失效了 大概翻译如下: 非正式协议:非正式协议是NSObject的一个类别Category,几乎所有的对象都隐含的采用(类别是OC的语言特性...setter方法内部做了什么呢??...,将它改为NO,否则会报参数太多的错误: 注意二 解释下代码中v@:@的意思: 第一个v表示方法返回值void 第二三个@:一般是一块的,因为函数至少有两个参数self和_cmd,一般是固定写法 最后一个

    2.4K20

    神经病院Objective-C Runtime住院第二天—消息发送与转发

    需要注意的是@selector()选择子只与函数名有关。不同类中相同名字的方法所对应的方法选择器是相同的,即使方法名字相同而变量类型不同也会导致它们具有相同的方法选择器。...FP2RET objc_msgSend_stret 传入的参数是NilTest STRET 如果检测方法的接受者是nil,那么系统会自动clean并且return。...在main中去NSObject去调用了这个foo方法,会编译错误,还是会Crash呢? 难点二是会输出什么内容呢? 先来看难点一,这里会牵扯到Category的知识。...这也就是为什么我们可以在Category里面覆盖原有的方法的原因,因为头插法,新的方法在链表的前面,会优先被遍历到。 以上就是Category加载时候的流程。...,找到,于是也会输出 IMP: -[NSObject(Sark) foo]复制代码 所以上面这题,不会Compile Error ,更不会 Runtime Crash ,会输出两个相同的结果。

    78730

    神经病院Objective-C Runtime住院第二天—消息发送与转发

    需要注意的是@selector()选择子只与函数名有关。不同类中相同名字的方法所对应的方法选择器是相同的,即使方法名字相同而变量类型不同也会导致它们具有相同的方法选择器。...FP2RET objc_msgSend_stret 传入的参数是NilTest STRET 如果检测方法的接受者是nil,那么系统会自动clean并且return。...在main中去NSObject去调用了这个foo方法,会编译错误,还是会Crash呢? 难点二是会输出什么内容呢? 先来看难点一,这里会牵扯到Category的知识。...这也就是为什么我们可以在Category里面覆盖原有的方法的原因,因为头插法,新的方法在链表的前面,会优先被遍历到。 以上就是Category加载时候的流程。...,找到,于是也会输出 IMP: -[NSObject(Sark) foo] 所以上面这题,不会Compile Error ,更不会 Runtime Crash ,会输出两个相同的结果。

    27410
    领券