4

我有一个 NSManagedObject 的子类,其中包含一些真正是枚举的“整数 32”属性。这些枚举在我的模型的 .h 文件中定义,如下所示:

typedef enum {
    AMOwningCompanyACME,
    AMOwningCompanyABC,
    AMOwningCompanyOther
} AMOwningCompany;

我需要显示一个表格视图来显示此自定义对象的每个属性的值,因此对于每个枚举,我都有一个看起来像这样的方法来返回字符串值:

-(NSArray*)stringsForAMOwningCompany
{
    return [NSArray arrayWithObjects:@"ACME Co.", @"ABC Co.", @"Other", nil];
}

在我的表格视图中,我遍历了我的属性NSManagedObject(使用NSEntityDescription'sattributesByName并且对于每个属性,我调用一个辅助方法,该方法调用适当的“stringsFor”方法来返回该特定属性的字符串:

-(NSArray*)getStringsArrayForAttribute:(NSString*)attributeName
{
    SEL methodSelector = NSSelectorFromString([self methodNameForAttributeNamed:attributeName]);
    NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:[[AMProperty class] instanceMethodSignatureForSelector:methodSelector]];
    [invocation setSelector:methodSelector];
    [invocation setTarget:self.editingPole];
    [invocation invoke];

    NSArray* returnValue = nil;
    [invocation getReturnValue:&returnValue];

    return returnValue;
}

我的表格视图cellForRowAtIndexPath如下所示:

...
NSString* itemName = self.tableData[indexPath.row];
NSAttributeDescription* desc = itemAttributes[itemName];

NSString* cellIdentifier = [self cellIdentifierForAttribute:desc]; // checks the attribute type and returns a different custom cell identifier accordingly
if ([cellIdentifier isEqualToString:@"enumCell"])
{
    // dequeue cell, customize it
    UITableViewCell* enumCell = ...
    ...
    NSArray* stringValues = [[NSArray alloc] initWithArray:[self getStringArrayForAttribute:itemName]];
    int currentValue = [(NSNumber*)[self.editingPole valueForKey:itemName] intValue];
    enumCell.detailTextLabel.text = (NSString*)stringValues[currentValue];
    return enumCell;
}
...

NSInvocation仅对于其中一个属性,我一直在返回数组上崩溃:

-[__NSArrayI release]: message sent to deallocated instance 0x856a4b0

使用 Zombies Profiler,我看到:

仪器截图

我正在使用 ARC。我该如何进一步调试呢?

4

1 回答 1

8

我自己最近遇到了一个非常相似的问题,我花了一段时间才弄清楚我做错了什么。这里发布了一个额外的版本——因为您的指针returnValue__strong(默认),ARC 认为该对象是通过该指针拥有的,但事实并非如此。

-[NSInvocation getReturnValue:]不拥有它,并且通过指针地址的“分配”绕过了objc_storeStrong()ARC 通常使用的。

解决方案很简单:将指针标记为__unsafe_unretained. 这是事实;对象不是通过这个指针保留的(如果它是的话__strong),并且 ARC 不能在这里释放它。

于 2013-08-18T03:03:49.083 回答