获取和更改NSMutableArray对象的问题

时间:2012-07-27 00:27:44

标签: memory object nsmutablearray nscopying copywithzone

我有一个名为 organizations 的NSMutableArray,它是一个从NSObject继承的类I的自定义对象数组,这个子类叫做 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;
}

现在,我分配&amp;像这样初始化数组:

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]];
}

索引是本地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 个答案:

答案 0 :(得分:0)

看起来您正在尝试访问已发布的对象。 检查您的自动释放呼叫。

答案 1 :(得分:0)

我设法通过更改自定义对象的头文件来解决此问题。

原件:

@property (nonatomic, retain) NSString *propertyOne;

工作:

@property (copy) NSString *propertyOne;

整个问题通常归结于我缺乏Objective-C知识(因此我还在学习的原因!)。谢谢你们