首页
学习
活动
专区
工具
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

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

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS_Extension、Category、load、initialize

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

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

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

    36030

    OC中Runtime浅析

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

    25420

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

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

    81160

    方法load和initialize区别

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

    2.3K40

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

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

    6.1K52

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

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

    92330

    Objective-C笔记

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

    92340

    Objective-C Runtime编程指南(1)

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

    78720

    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:这个两个方法,这个时候要把BmodalPresentationStyle设置为:UIModalPresentationFullScreen

    1.6K10

    ios Category

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

    42710

    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 中没有

    58130

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

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

    1.9K31

    KVO详解及底层实现

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

    2.3K20

    神经病院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 ,输出两个相同结果。

    76530

    神经病院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 ,输出两个相同结果。

    24410
    领券