Class [矩形class]中使用的方法
Class method used in [Rectangle class]
"class" 方法在 [Rectangle class] 中的用途是什么?它会创建 Rectangle 的实例吗?我以为那是
Rectangle *aRectangle = [[Rectangle alloc] init].
Why/When 我会用 [Rectangle class] 吗?
以下可能是 [Rectangle class]
最常见的两种用法:
您可以使用 [Rectangle class]
来检查对象是否是 Rectangle
的实例(或 Rectangle
的子class 的实例):
if ([object isKindOfClass:[Rectangle class]]) {
Rectangle *rect = (Rectangle *)object;
// ... use rect
}
但是如果您只有一条消息要发送,最好只检查对象是否理解您要发送的消息:
if ([object respondsToSelector:@selector(area)]) {
double area = [object area];
// etc.
}
您可以使用 class 对象来创建 class:
的实例
Class rectangleClass = [Rectangle class];
Rectangle *rectangle = [[rectangleClass alloc] init];
你为什么要这样做?好吧,如果您在要创建它的位置(在您的代码中)明确知道 class,您就不会这样做。例如,您只需说 [[Rectangle alloc] init]
。
但请考虑 UIView
。每个 UIView
创建并管理一个 CALayer
。默认情况下,它会创建 CALayer
的实例,但您可能希望视图使用 CAShapeLayer
(example) or a CAGradientLayer
(example) 来代替。您需要一种方法来告诉 UIView
创建一个不同的 class.
的实例
您可以通过覆盖 the layerClass
class method:
来告诉您的 UIView
subclass 要创建什么样的层
@implementation MyShapeView
+ (Class)layerClass {
return [CAShapeLayer class];
}
当 MyShapeView
创建其图层时,它会发送自己 layerClass
并创建它返回的任何 class 的实例。代码可能看起来像这样:
@implementation UIView {
CALayer *_layer;
}
- (CALayer *)layer {
if (_layer == nil) {
_layer = [[[self layerClass] alloc] init];
_layer.delegate = self;
}
return _layer;
}
"class" 方法在 [Rectangle class] 中的用途是什么?它会创建 Rectangle 的实例吗?我以为那是
Rectangle *aRectangle = [[Rectangle alloc] init].
Why/When 我会用 [Rectangle class] 吗?
以下可能是 [Rectangle class]
最常见的两种用法:
您可以使用
[Rectangle class]
来检查对象是否是Rectangle
的实例(或Rectangle
的子class 的实例):if ([object isKindOfClass:[Rectangle class]]) { Rectangle *rect = (Rectangle *)object; // ... use rect }
但是如果您只有一条消息要发送,最好只检查对象是否理解您要发送的消息:
if ([object respondsToSelector:@selector(area)]) { double area = [object area]; // etc. }
您可以使用 class 对象来创建 class:
的实例Class rectangleClass = [Rectangle class]; Rectangle *rectangle = [[rectangleClass alloc] init];
你为什么要这样做?好吧,如果您在要创建它的位置(在您的代码中)明确知道 class,您就不会这样做。例如,您只需说
[[Rectangle alloc] init]
。但请考虑
的实例UIView
。每个UIView
创建并管理一个CALayer
。默认情况下,它会创建CALayer
的实例,但您可能希望视图使用CAShapeLayer
(example) or aCAGradientLayer
(example) 来代替。您需要一种方法来告诉UIView
创建一个不同的 class.您可以通过覆盖 the
来告诉您的layerClass
class method:UIView
subclass 要创建什么样的层@implementation MyShapeView + (Class)layerClass { return [CAShapeLayer class]; }
当
MyShapeView
创建其图层时,它会发送自己layerClass
并创建它返回的任何 class 的实例。代码可能看起来像这样:@implementation UIView { CALayer *_layer; } - (CALayer *)layer { if (_layer == nil) { _layer = [[[self layerClass] alloc] init]; _layer.delegate = self; } return _layer; }