假设您有一个UIView子类.您定义了一个init方法"myInitWithFrame:... andWhatNot:...".你知道你不会使用从UIView的继承init方法永远和您的自定义init方法做了一些重要的习俗正在初始化,这样要强制客户端类从未使用继承initWithFrame方法.
是否可以隐藏从UIView继承的标准initWithFrame方法?
BJ *_*mer 20
其实,你可以得到编译时警告有关调用子类中的方法.使用该__attribute((deprecated))属性.如果您希望人们使用-initWithPizza:而不是-initWithFrame:,请执行以下操作:
@interface MyView : UIView
- (id)initWithPizza:(MyPizza *)pizza;
@end
@interface MyView (Deprecations)
- (id)initWithFrame:(CGRect)frame __attribute((deprecated("Use initWithPizza: instead")));
@end
Run Code Online (Sandbox Code Playgroud)
将-initWithFrame:声明放在单独的类别中是必要的,以避免Xcode抱怨您在标头中声明了方法但没有实现它.既然你只是从超类继承它,那很好; 你不具备实现它.但是如果你想实现它来抛出异常,或者-initWithPizza:用默认参数调用,那很好.
当然,-initWithFrame:如果UIKit 已经打算这样做,这不会阻止UIKit打电话.但如果你能保证不会发生,那你就没事了.
实际上,您可以使用子类进行限制.您可以覆盖要在子类的.h文件中阻止的任何方法.您可以initWithFrame将以下内容放入.h文件中以使其不可用.
- (id) initWithFrame:(CGRect) frame __attribute__((unavailable("message")));
Run Code Online (Sandbox Code Playgroud)
这将使initWithFrame:使用您的子类的任何人都无法使用该方法.
要保持其他代码形式调用此方法,您可以通过将其放在您的.m文件中进一步限制.
- (id) initWithFrame:(CGRect) frame
{
return nil;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1738 次 |
| 最近记录: |