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

时间:2011-03-13 02:13:00

标签: iphone objective-c ios ipad subclassing

我遇到了MKPolygon子类的问题。

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

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

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

谢谢!

6 个答案:

答案 0 :(得分: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

除了@hoha链接到的API之外,您可能还需要查看Associative References section of the ObjC Guide

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

我面临同样的问题。一个简单的解决方案是只使用MKPolygon的Title属性来保存您在Tag中保存的内容。至少在我不需要对象引用但只需要简单数字的情况下,它可以正常工作

答案 3 :(得分:1)

SpecialPolygon *polygon = [SpecialPolygon polygonWithCoordinates:count:];
[polygon setInt: 3];

关键是,使用SpecialPolygon工厂方法而不是MKPolygon方法,您将获得所需的SpecialPolygon子类。

答案 4 :(得分:0)

您是在谈论代码或其他地方创建的MKPolygons吗?如果是前者,只需覆盖polygonWithStuff方法即可。如果是后者,请考虑超过MKPolygon的类别。然后项目中的所有MKPolygons都会有一个标记。

答案 5 :(得分:0)

因为看起来作者不愿意阻止你进行子类化(至少,这是公共接口的一个可能动机),考虑使用一种组合形式:

http://en.wikipedia.org/wiki/Object_composition