如何使用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
你可以做两件事,
- 你可以把它写在一个类中,并把它导入到你需要这个function的所有类中。
- 或者分别写下这些行
.h
和.m
(分别),你需要它。