То, что упомянуто здесь до сих пор, мне не совсем помогло, но я нашел решение, основанное на других ответах и некоторых независимых исследованиях. Я не уверен на 100% в этом, но вы можете привести MKPolyline в пользовательский подкласс only , если вы используете статический вызов метода, который вызывает правильный метод init изнутри.
(CustomPolyline*)[CustomPolyline polylineWithCoordinates:coordinates count:coordinateCount]
Выше не будет работать, потому что polylineWithCoordinates
выделяет память только для объекта MKPolyline
, а не CustomPolyline
. Я подозреваю, что внутренне происходит то, что polylineWithCoordinates
вызывает другой метод инициализатора способом, подобным: [MKPolyline otherInitMethod:...]
. И он не выделяет должный объем памяти, потому что теперь он использует статический вызов метода MKPolyline
, а не наш CustomPolyline
статический вызов.
Однако, если мы используем
(CustomPolyline*)[CustomPolyline polylineWithPoints:polyline.points count:polyline.pointCount];
Это работает. Я думаю, это потому, что polylineWithPoints
использует инициализатор, который возвращает id
, а не просто цепочку к другому вызову метода. И поскольку мы вызывали его с помощью класса CustomPolyline
, инициализатор выделяет память для CustomPolyline
, а не MKPolyline
.
Я могу быть совершенно не прав, почему это работает. Но я проверил это, и, кажется, работает нормально. MKPolygon
может быть расширен аналогичным образом. В этом случае я думаю, что правильный статический метод для использования MKPolygon polygonWithCoordinates:points count:pointSet.count]]
Моя реализация для справки:
CustomPolyline.h
#import <MapKit/MapKit.h>
typedef enum {
CustomPolylineTypeNone = 0,
CustomPolylineDifferentStrokes
} CustomPolylineType;
/**
* CustomPolyline wraps MKPolyline with additional information about a polyline useful for differentiation.
*/
@interface CustomPolyline : MKPolyline
@property CustomPolylineType type;
-(CustomPolyline*)initWithMKPolyline:(MKPolyline*)polyline;
@end
CustomPolyline.m
#import "CustomPolyline.h"
@implementation CustomPolyline
@synthesize type;
/**
* Takes an MKPolyline and uses its attributes to create a new CustomPolyline
*/
-(CustomPolyline*)initWithMKPolyline:(MKPolyline*)polyline
{
// We must use the this specific class function in this manner to generate an actual
// CustomPolyline object as opposed to a MKPolyline by a different name
return (CustomPolyline*)[CustomPolyline polylineWithPoints:polyline.points count:polyline.pointCount];
}
@end