Проблемы с получением и изменением объектов NSMutableArray

У меня есть NSMutableArray под названием организаций, который представляет собой массив пользовательских объектов класса, который я подкласс из NSObject, этот подкласс называется NSXOrganisation. Этот подкласс реализует NSCopy следующим образом:

@interface NSXOrganisation : NSObject <NSCopying>

...

- (id)copyWithZone:(NSZone *)zone
{
    id copy = [[[self class] alloc] init];

    if (copy) 
    {
        [copy setPropertyOne:[[[self getPropertyOne] copyWithZone:zone] autorelease]];           
    }

    return copy;
}

Теперь я выделяю и инициализирую массив следующим образом:

organisations = [[NSMutableArray alloc] initWithArray:organisationsArray copyItems:YES];

Это все отлично работает. Для тестирования в массиве есть 2 объекта.

Затем, когда вызывается метод, я обновляю объект в массиве следующим образом:

- (void)updateOrganisation
{
    [[organisations objectAtIndex:0] setConsumerKey:[tfPropertyOne stringValue]];
}

Где tfPropertyOne* - это NSTextField на дисплее (правильно привязанный и т. Д.). Это также работает нормально, так как я проверил с NSLog, и он выводит правильный результат. Затем я вызываю метод отображения для другого индекса в массиве, чтобы просмотреть соответствующие сведения:

- (void)displayOrganisation:
{
    [tfPropertyOne setStringValue:[[organisations objectAtIndex:index] getPropertyOne]];
}

index является локальным NSInteger и не является проблемой. Затем я вызываю тот же метод обновления для этого объекта, который, видимо, тоже работает нормально (используя NSLog для тестирования).

Наконец, когда я делаю вызов, чтобы вернуться и отобразить первый объект в массиве [self displayOrganisation:0], вызов работает успешно, но мое приложение падает при вызове getPropertyOne.

Это ошибка в консоли Mac:

...: Invalid memory access of location 0x3bcfd069 eip=0x90c1cd5c

И это из отчета о сбое:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x90c1cd4b objc_msgSend + 27
1   com.apple.Foundation            0x943da945 _NSDescriptionWithLocaleFunc + 57
2   com.apple.CoreFoundation        0x906503ae __CFStringAppendFormatCore + 12238
3   com.apple.CoreFoundation        0x906a70dc _CFStringCreateWithFormatAndArgumentsAux + 108
4   com.apple.CoreFoundation        0x9072821c _CFLogvEx + 124
5   com.apple.Foundation            0x9445d221 NSLogv + 136
6   com.apple.Foundation            0x9445d194 NSLog + 27
7   co.nz.fdl.XeroConnect           0x1b5b4872 -[PrefsController displayOrganisation:] + 194 (PrefsController.mm:229)

Кто-нибудь может помочь? Я получаю доступ / создание / хранение объектов в массиве неправильно?

2 ответа

Решение

Мне удалось решить эту проблему, изменив заголовочный файл для пользовательского объекта.

Оригинал:

@property (nonatomic, retain) NSString *propertyOne;

За работой:

@property (copy) NSString *propertyOne;

Вся эта проблема была, как правило, из-за моего отсутствия знаний Objective-C (следовательно, почему я все еще учусь!). Спасибо, парни

Похоже, вы пытаетесь получить доступ к объекту, который уже был освобожден. Проверьте ваши автоматические звонки.

Другие вопросы по тегам