Проблемы с получением и изменением объектов 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 (следовательно, почему я все еще учусь!). Спасибо, парни
Похоже, вы пытаетесь получить доступ к объекту, который уже был освобожден. Проверьте ваши автоматические звонки.