[英]Class method used in [Rectangle class]
在[矩形類]中使用的“類”方法是什么? 是否創建Rectangle的實例? 我以為那是
Rectangle *aRectangle = [[Rectangle alloc] init].
為什么/何時使用[矩形類]?
這可能是[Rectangle class]
的兩個最常見的用法:
可以使用[Rectangle class]
來檢查對象是否是的一個實例Rectangle
(或子類的實例Rectangle
):
if ([object isKindOfClass:[Rectangle class]]) { Rectangle *rect = (Rectangle *)object; // ... use rect }
但是,如果您只發送一條消息,最好檢查對象是否理解您要發送的消息:
if ([object respondsToSelector:@selector(area)]) { double area = [object area]; // etc. }
您可以使用class對象創建該類的實例:
Class rectangleClass = [Rectangle class]; Rectangle *rectangle = [[rectangleClass alloc] init];
你為什么想這么做? 好吧,如果您在要創建類的位置(在代碼中)顯式知道了該類,則不會。 例如,您只需要說[[Rectangle alloc] init]
。
但是考慮一下UIView
。 每個UIView
都會創建和管理一個CALayer
。 默認情況下,它創建CALayer
的實例,但是您可能希望視圖使用CAShapeLayer
(示例)或CAGradientLayer
(示例)代替。 您需要一種方法來告訴UIView
創建其他類的實例。
您可以通過覆蓋layerClass
類方法來告訴您的UIView
子類要創建哪種層:
@implementation MyShapeView + (Class)layerClass { return [CAShapeLayer class]; }
當需要使用MyShapeView
創建其圖層時,它將發送自身layerClass
並創建它返回的任何類的實例。 該代碼可能看起來像這樣:
@implementation UIView { CALayer *_layer; } - (CALayer *)layer { if (_layer == nil) { _layer = [[[self layerClass] alloc] init]; _layer.delegate = self; } return _layer; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.