Objective-C子类化基础知识,如何添加自定义属性;

Zeb*_*ebs 11 iphone objective-c subclassing ipad ios

我有一个问题子类MKPolygon.

我想添加一个简单的int tag属性,但我不断获取MKPolygon的实例而不是我的自定义类,因此调用setTag:会导致异常.

问题是MKPolygons是使用类方法创建的:polygonWithCoordinates: count:我不知道如何将其转换为我的类的实例(包括标记属性).

您如何向MKPolygon添加标签属性?

谢谢!

sku*_*kue 20

你应该使用一个类别(如@Seva建议)和objc_setAssociatedObject(如@hoha建议的那样).

@interface MKPolygon (TagExtensions)
@property (nonatomic) int tag;
@end

@implementation MKPolygon (TagExtensions)
static char tagKey;

- (void) setTag:(int)tag {
    objc_setAssociatedObject( self, &tagKey, [NSNumber numberWithInt:tag], OBJC_ASSOCIATION_RETAIN );
}

- (int) tag {
    return [objc_getAssociatedObject( self, &tagKey ) intValue];
}

@end
Run Code Online (Sandbox Code Playgroud)

除了链接到的API @hoha之外,您可能还需要查看ObjC指南的"关联引用"部分.

  • 不要忘记`#import <objc/runtime.h>` (3认同)

hoh*_*oha 5

看起来开发人员MKPolygon没有让它继承友好.如果你想要的只是为这个实例添加一些标签,你可以

1)保持从MKPolygon实例地址到标签的映射(NSDictionary或CFDictionary).如果在设置的同一类中需要所有标记,则此解决方案很有效.

2)使用运行时直接将标签附加到多边形 - objc_setAssociatedObject(Objective-C Runtime Reference)