如何使用Objective-C类别

时间:2013-04-22 18:32:32

标签: iphone ios objective-c objective-c-category

当您在文件中实现类的类别时,默认情况下该类的所有实例都属于该类别吗?

我是Objective-C的新手,我正在尝试使我的不可编辑的UITextView不可选。我使用一个类别来看到这个答案: https://stackoverflow.com/a/8013538/1533240

具有以下解决方案:

@implementation UITextView (DisableCopyPaste)

-(BOOL) canBecomeFirstResponder
{
    return NO;
}
@end

我已将代码段添加到我的代码中,但似乎无法正常工作,因为我仍然可以选择文本。我对UITextView的声明是通常的:

titleLabel = [[UITextView alloc] initWithFrame:frame];

我尝试将声明更改为[DisableCopyPaste alloc],但这似乎不起作用。哈哈。

谢谢!

3 个答案:

答案 0 :(得分:20)

你误解了类别的要点。类别将方法添加到现有类。它们绝不能用于覆盖现有方法。这样做是未定义的行为(技术上只在一种情况下未定义,但您无法预测这种情况,因此您必须假设它适用)。

如果需要覆盖方法,则必须是子类,而不是使用类别。请参阅您链接的问题的最佳答案。

答案 1 :(得分:6)

  

当您在文件中实现类的类别时,将全部执行   该类的实例默认属于该类别?

是。如果您创建了一个类别the methods in that category are added to the class。例如,如果在NSString上创建一个返回字符串校验和的类别,则可以在任何 NSString实例上使用该方法。

  

我已将代码段添加到我的代码中,但似乎无法正常工作,我仍然可以选择文字。

请勿使用类别覆盖现有方法。

首先,它是糟糕的形式。您实际上是以作者没想到的方式更改类的行为。另一方面,你不能指望覆盖工作 - 没有定义类别添加到类的顺序,所以你永远不知道是否有一些其他类别可以出现并替换您尝试替换的方法。它根本不可靠。 如果您需要覆盖方法,请改为创建子类。

答案 2 :(得分:0)

您需要做的是在标头category文件中声明.h

如:

@interface UITextView (DisableCopyPaste)
-(BOOL) methodName
@end

然后在.m中定义为

@implementation UITextView (DisableCopyPaste)
-(BOOL) methodName
{
    return NO;
}
@end

你可以做两件事,

  1. 您可以在类中编写它并将其导入到您需要此功能的所有类中。
  2. 或者分别写下.h.m(分别)所需的这些行。