【问题标题】:objective-c ios: override implementation method of classobjective-c ios:覆盖类的实现方法
【发布时间】:2014-04-29 18:26:03
【问题描述】:

我是 iOS 开发的新手,有点被这样的问题困扰。

在我的 iphone 应用程序中,我正在使用这个很棒的下拉视图控制器 https://github.com/nmattisson/DropdownMenu通过 Cocoapods。

我在自己的MyDropdownMenuController 中扩展DropdownMenuController:

MyDropdownMenuController.h

#import "DropdownMenuController.h"

@interface MyDropdownMenuController : DropdownMenuController

@end

我想在我的控制器实例中覆盖这个drawOpenLayer (https://github.com/nmattisson/DropdownMenu/blob/master/DropdownMenu/DropdownMenuController.m#L126) 方法,但不幸的是编译器说这是不可能的:

MyDropdownMenuController.m

- (void)drawOpenLayer {
   // compiler says 
   // "No visible @interface for "DropdownMenuController" declares the selector "drawOpenLayer"
   [super drawOpenLayer];
}

是否可以在不实际更新外部接口等的情况下覆盖此方法?

【问题讨论】:

  • 你不能修改 DropdownMenuController.h 文件来声明那个方法吗?
  • 你可以在不调用[super drawOpenLayer]的情况下实现drawOpenLayer,但当然你会失去任何功能,你需要自己实现它。
  • @rdelmar 我不想修改 DropdownMenuController.h 因为它是一个 cocoapod 包

标签: ios objective-c class inheritance overriding


【解决方案1】:

您可以创建一个定义方法的类别

@interface DropdownMenuController (MichaelHacksIt)

- (void)drawOpenLayer;

@end

(不需要为此定义@implementation,因为它已经实现了。)

那么你可以直接调用那个方法。

免责声明: 顺便说一句,如果您想调用未记录的方法并且不关心 Apple 的批准,这就是要走的路。在这种情况下,它没有任何问题,因为您没有破解 Apple 代码,Apple 也不在乎您是否破解了一些 CocoaPods 程序。但是,您依赖于第三方软件包的内部结构,因此下次更新该软件包时可能会出现问题...

【讨论】:

  • @bbum:感谢编辑。现在它更有意义了
  • @rdelmar(回复对您已删除答案的评论)。注意这里的微妙之处;类别只是类实现方法的声明,而不是实际替换类的原始实现的实现。也就是说,其意图是声明超类实际上实现了一些方法,以便您可以覆盖所述方法并通过[super ...]; 调用它。当应用于开源框架时,它是相当低俗的,而当用于系统提供的类时,它是被禁止的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
相关资源
最近更新 更多