我有一个名为organizations的 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)
任何人都可以帮忙吗?我是否错误地访问/创建/存储对象到数组中?