4

実際には列挙型であるいくつかの「整数 32」属性を持つ NSManagedObject のサブクラスがあります。これらの列挙型は、モデルの .h ファイルで次のように定義されています。

typedef enum {
    AMOwningCompanyACME,
    AMOwningCompanyABC,
    AMOwningCompanyOther
} AMOwningCompany;

このカスタム オブジェクトの各属性の値を表示するテーブル ビューを表示する必要があるため、列挙型ごとに、次のような文字列値を返すメソッドを用意します。

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

テーブル ビューでは、 my の属性を反復処理します(NSManagedObjectを使用し、属性ごとに、適切な "stringsFor" メソッドを呼び出すヘルパー メソッドを呼び出して、その特定の属性の文字列を返します。NSEntityDescriptionattributesByName

-(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;
}
...

属性の 1 つだけについて、NSInvocationの戻り配列でクラッシュが発生し続けます。

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

Zombies Profiler を使用すると、次のように表示されます。

楽器のスクリーンショット

ARCを使用しています。これをさらにデバッグするにはどうすればよいですか?

4

1 に答える 1