NSArrayController перераспределяет массив?

У меня есть NSCollectionView, содержимое которого привязано к объектам NSArrayController. Когда я вызываю addObject: на контроллере массива, кажется, что он перераспределяет базовый массив - я могу наблюдать за изменением адресов указателя. Это неприемлемое поведение для моего конкретного случая, поскольку другие объекты также зависят от массива.

Это нормальное поведение или я что-то делаю не так? Я видел несколько альтернативных решений, таких как прямое изменение массива и вызов willChangeValueforKey: и didChangeValueForKey: на контроллере, но это не кажется самым элегантным решением.

Я новичок в Objective-C и Cocoa, так что не беспокойтесь. :)

Спасибо!


person Drew Lederman    schedule 25.01.2013    source источник


Ответы (1)


@interface NSArrayController : NSObjectController {
@private
    void *_reserved4;
    id _rearrangementExtensions;
    NSMutableArray *_temporaryWorkObjects;
    NSUInteger _observedIndexHint;
    NSMutableIndexSet *_selectionIndexes;
    NSMutableArray *_objects;
    NSIndexSet *_cachedSelectedIndexes;
    NSArray *_cachedSelectedObjects;
    NSArray *_arrangedObjects;
}

Если вы посмотрите на заголовок NSArrayController, переменная экземпляра для managedObject - это NSArray, поэтому ему придется создавать новый массив всякий раз, когда вы добавляете новый объект, и это нормальное поведение.

person TheAmateurProgrammer    schedule 26.01.2013
comment
Спасибо! Как лучше всего изменить массив напрямую и сохранить само представление с изменениями? - person Drew Lederman; 28.01.2013
comment
Или мне было бы лучше создать свой собственный класс контроллера, который работает с NSMutableArray? @TheAmateurProgrammer - person Drew Lederman; 29.01.2013
comment
@DrewLederman Могу я спросить, почему вы хотите использовать один и тот же массив? Мне это кажется странным. - person TheAmateurProgrammer; 29.01.2013
comment
По сути, массив принадлежит моему классу менеджера учетных записей, который является синглтоном. Я просто пытался избежать ситуаций, когда другие объекты, которые могут ссылаться на учетные записи, станут недействительными, когда контроллер изменит массив. Я только что переделал менеджера по работе с клиентами, чтобы это не было проблемой. Спасибо за вашу помощь! - person Drew Lederman; 29.01.2013