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

我有一个问题MKPolygon

我想添加一个简单的int tag属性,但我不断得到一个MKPolygon的实例,而不是我的自定义类,所以调用setTag:会导致exception。

问题是MKPolygons是使用类方法创build的: polygonWithCoordinates: count:我不知道如何把它变成我的类的实例(包括标签属性)。

你将如何去添加标签属性到MKPolygon?

谢谢!

您应该使用一个类别(如@Sevabuild议)和objc_setAssociatedObject(如@hohabuild议)。

 @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 

除了链接的API @hoha之外,您还可以查看“ObjC指南”的“关联参考”部分 。

看起来MKPolygon开发者并没有使它inheritance友好。 如果你想要的只是添加一些标签到这个实例,你可以

1)保存从MKPolygon实例地址到标记的映射(NSDictionary或CFDictionary)。 如果所有标签都是在同一个类中设置的,那么这个解决scheme就可以工作。

2)使用运行时直接附加标签到多边形 – objc_setAssociatedObject ( Objective-C运行时参考 )

我面临同样的问题。 一个简单的解决scheme就是使用MKPolygon的Title属性来保存标签中的内容。 至less在我不需要对象引用而是一个简单的数字的情况下,它就可以工作

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

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

你是在谈论由你的代码或其他地方创build的MKPolygons? 如果前者只是覆盖polygonWithStuff方法。 如果是后者,考虑一个类MKPolygon。 然后你项目中的所有MKPolygons都会有一个标签。

因为它看起来像作者竭力阻止你inheritance子类(至less,这是公共接口的一个可能的动机),考虑使用一种组合forms:

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