gpt4 book ai didi

iphone - 使用类别子类化类时如何避免编译警告?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:32:52 26 4
gpt4 key购买 nike

假设我们有父类

ParentViewController.h

@interface ParentViewController

....

@end

ParentViewController.m

@interface ParentViewController()

- (NSArray *)selectedItems;

@end

@implementation ParentViewController

.....

@end

然后我们将它子类化

ChildViewController.h

@interface ChildViewController : ParentViewController

....

@end

ChildClassViewController.m

@implementation ChildViewController

- (void)doSomething
{
// XCode Warning Flag on this line
NSUInteger count = [self selectedItems];

.....
}

XCode 将在注释行设置警告标志并提示“未找到实例方法‘-selectedItems’(返回类型默认为‘id’)。

是的,我知道在 ObjC 中没有私有(private)方法这样的东西,但是使用空类别可以做到这一点。但不知何故,它不会被子类继承。

我通常通过将方法从 ParentViewController.m 移动到 ParentViewController.h 来修复它。这感觉很奇怪,我失去了将方法设为私有(private)的能力,只是因为我需要对其进行子类化。

现在我的问题是:

  1. 为什么父子类在.m文件中找不到类中声明的那些方法?

  2. 有没有一种方法可以移除警告标志,但又不会失去保持方法私有(private)的能力。

希望有更多经验的人能够帮助解释这个烦人的问题。

最佳答案

首先,请注意您的“空类别”根本不是类别,而是类扩展。类扩展与类别非常相似,但它们是 Objective C 2.0 中的新内容,并且在使用上略有不同。首先,如果您不在类扩展中实现方法,编译器会警告您,但它不会在类别中实现。无论如何,关于手头的问题......

Objective-C 中的隐私就是可见性。如果编译器看不到正在使用的方法的声明,您将收到警告。请注意,如果您要在与类扩展相同的文件中实现子类,编译器不会警告您,因为它可以看到声明。

因此,如果您想在子类中使用“私有(private)”方法,您只需要通过某种方式向编译器表明这些方法的存在。我最喜欢的模式是在单独的文件(如 MyClass_private.h)中的类别中声明私有(private)方法。然后,您只需将该接口(interface)导入到基类和任何需要查看它的派生类的实现文件中。

关于iphone - 使用类别子类化类时如何避免编译警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9643037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com