2012-03-10 71 views
2

说我们有父类如何在使用类别子类化类时避免编译警告?

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中没有私人方法这样的事情,但使用空的类别类型可以这样做。但不知何故,它不会被子类继承。

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

现在我的问题是:

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

  2. 有没有办法删除警告标志,但不失去保持私有方法的能力。

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

回答

3

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

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

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

+0

是的这个作品。在同一个.m文件中结合父类和子类不是一个选项,因为它们很大。将这些私有方法放在单独的文件中很麻烦。我会接受这个答案,我不认为会有任何其他的方式。 – 2012-03-10 02:55:39

+0

@SamuelChandra,是的,同一个文件只是琐事。你应该永远不要那样做。 – 2012-03-10 03:03:49

2

我有一个解决方案,但通常我会建议反对它。如果使用-w编译文件(禁止所有警告),警告消失。我不知道这条消息是否有特定的警告标志,如果有的话,您可以使用#pragma GCC diagnostic ignored "-Winstance-method-not-found",但我找不到它,对不起。

+0

+1:正确,但我也建议反对。这些警告是有用的99%的时间:) – 2012-03-10 02:19:33

+0

-w禁止所有警告,不是我可以采取的选项。谢谢 – 2012-03-10 02:36:16

相关问题