如何使用Objective-C类别

Kir*_*Koa 9 iphone objective-c ios objective-c-category

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

我是Objective-C的新手,我试图使我的不可编辑的UITextView不可选.我使用以下类别找到了这个答案:https: //stackoverflow.com/a/8013538/1533240

其中有以下解决方案:

@implementation UITextView (DisableCopyPaste)

-(BOOL) canBecomeFirstResponder
{
    return NO;
}
@end
Run Code Online (Sandbox Code Playgroud)

我将代码段添加到我的代码中,但它似乎没有起作用,我仍然可以选择文本.我的声明UITextView是通常的:

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

我试着改变声明,[DisableCopyPaste alloc]但似乎没有用......哈哈.

谢谢!

Rob*_*ier 20

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

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


Cal*_*leb 6

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

是.如果创建类别,则该类别中的方法将添加到类中.例如,如果在NSString上创建一个返回字符串校验和的类别,则可以在NSString的任何实例上使用该方法.

我将代码段添加到我的代码中,但它似乎没有起作用,我仍然可以选择文本.

不要使用类别来覆盖现有方法.

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