如何使用Objective-C类别

当你在一个文件中实现一个类的类别时,这个类的所有实例默认都是这个类的吗?

我是新来的Objective-C,我试图让我不可调整的UITextView不可选。 我遇到了这个答案使用一个类别: https : //stackoverflow.com/a/8013538/1533240

其中有以下解决scheme:

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

我将代码片段添加到我的代码中,但似乎没有工作,我仍然可以select文本。 我的UITextView声明是通常的:

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

我试着将声明更改为[DisableCopyPaste alloc]但似乎没有工作..哈哈。

谢谢!

你误解了类别的观点。 类别将方法添加到现有的类。 绝不能用它们来覆盖现有的方法。 这样做是未定义的行为(从技术上讲,在一个案例中只有未定义,但是你不能预测这种情况,所以你必须假定它适用)。

如果您需要重写方法,则必须进行子类化,而不是使用类别。 看到你链接的问题的最佳答案。

当你在一个文件中实现一个类的类别时,这个类的所有实例都是默认的类?

是。 如果您创build一个类别, 则该类别中的方法将被添加到类中 。 例如,如果您在NSString上创build一个返回string校验和的类别,则可以在任何 NSString实例上使用该方法。

我将代码片段添加到我的代码中,但似乎没有工作,我仍然可以select文本。

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

首先,这是糟糕的forms。 你正在以一种作者没有想到的方式有效地改变这个类的行为。 另一方面,你不能指望重写的工作 – 类别添加到类的顺序没有定义,所以你永远不知道是否有其他类别可能会出现,并取代你试图更换的方法。 这根本不可靠。 如果您需要重写方法,请改为创build一个子类。

你需要做的是在头文件中声明category .h文件:

如:

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

然后在.m定义为

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

你可以做两件事,

  1. 你可以把它写在一个类中,并把它导入到你需要这个function的所有类中。
  2. 或者分别写下这些行.h.m (分别),你需要它。