Вопрос по аннотациям MKMapView - PullRequest
       6

Вопрос по аннотациям MKMapView

0 голосов
/ 20 сентября 2011

Из документации, свойство MKMapView, Annotations, является NSArray, а не NSMutableArray. Таким образом, аннотации должны быть «неизменными». Но мгновенные методы MKMapView: addAnnotation и removeAnnotation способны изменять массив аннотаций. Так что на первый взгляд кажется, что есть некоторые несоответствия. Там должно быть что-то, что я пропустил. Надеюсь, что кто-то знающий может пролить свет на это.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Объявляя свойство annotations NSArray, код, который обращается к массиву через это свойство , не может безопасно изменить его и должен рассматривать его как неизменяемый NSArray.Однако это не означает, что сам массив является неизменным.

Вот пример того, как что-то подобное может работать:

@interface MyObject
{
   // instance variables
   NSMutableArray* internalArrayRepresentation;
}

// properties
@property (nonatomic, readonly) NSArray* immutableAccessor;

// methods
-(void)addItem:(NSObject*)object;

@end


@implementation MyObject

@synthesize immutableAccessor=internalArrayRepresentation;

-(id)init
{
   if ((self = [super init]))
   {
      // create the mutable array
      internalArrayRepresentation = [[NSMutableArray alloc] init]
   }
}

-(void)addItem:(NSObject*)object
{
    [internalArrayRepresentation addObject:object];
}

...

@end

В этом примере вы можете видеть, что internalArrayRepresentation является изменяемым массивом и доступен вне MyObject как immutableAccessor.Но поскольку в определении свойства сказано, что immutableAccessor является NSArray, вызывающие абоненты должны обращаться с ним таким образом и не могут манипулировать им.

Существуют и другие реализации, которые также могут выполнить это.

Типичная причина для использования такого шаблона заключается в том, что вы хотите, чтобы MyObject сохранял контроль над содержимым массива: возможно, могут быть добавлены только определенные объекты, возможно, объекты должны быть изменены или клонированы по пути,может быть что-нибудь может быть добавлено, но ничего не может быть удалено и т. д.

0 голосов
/ 20 сентября 2011

Вы должны использовать addAnnotation и removeAnnotation для добавления / удаления аннотаций вместо непосредственного манипулирования массивом аннотаций.

Я предполагаю, что обе эти функции выполняют некоторую обработку, а также добавляют / удаляют аннотациииз массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...