gpt4 book ai didi

objective-c - 子类和类方法

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:44 26 4
gpt4 key购买 nike

我想继承 UIBezierPath 以添加 CGPoint 属性。

@interface MyUIBezierPath : UIBezierPath
@property CGPoint origin;
@end

我是这样使用它的:

MyUIBezierPath * path0 = [MyUIBezierPath bezierPathWithRoundedRect:
CGRectMake(0, 0, 20, 190) byRoundingCorners:UIRectCornerAllCorners
cornerRadii:CGSizeMake(10, 10)];

编译器提示:Incompatible pointer types initializing 'MyUIBezierPath *__strong' with an expression of type 'UIBezierPath *'

bezierPathWithRoundedRect 返回 UIBezierPath。

所以我不能将 setOrigin: 发送到 path0,因为它不是 MyUIBezierPath 的一个实例。

我应该修改什么以使 bezierPathWithRoundedRect 返回我的类的实例?

编辑:阅读相关问题后,我觉得在这种情况下子类化可能不是最好的做法(扩展 UIBezierPath 功能)。

最佳答案

一种方法是覆盖子类中的方法并更改返回对象的类:

#import <objc/runtime.h>

+ (UIBezierPath *)bezierPathWithRoundedRect:(CGRect)rect cornerRadius:(CGFloat)cornerRadius
{
UIBezierPath *path = [super bezierPathWithRoundedRect:rect cornerRadius:cornerRadius];

object_setClass(path, self);

return path;
}

更简洁的方法是使用关联对象将属性添加到类别中的 UIBezierPath

例如:

static const char key;
- (CGPoint)origin
{
return [objc_getAssociatedObject(self, &key) CGPointValue];
}

- (void)setOrigin:(CGPoint)origin
{
objc_setAssociatedObject(self, &key, [NSValue valueWithCGPoint:origin], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

关于objective-c - 子类和类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13158237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com