実際には列挙型であるいくつかの「整数 32」属性を持つ NSManagedObject のサブクラスがあります。これらの列挙型は、モデルの .h ファイルで次のように定義されています。
typedef enum {
AMOwningCompanyACME,
AMOwningCompanyABC,
AMOwningCompanyOther
} AMOwningCompany;
このカスタム オブジェクトの各属性の値を表示するテーブル ビューを表示する必要があるため、列挙型ごとに、次のような文字列値を返すメソッドを用意します。
-(NSArray*)stringsForAMOwningCompany
{
return [NSArray arrayWithObjects:@"ACME Co.", @"ABC Co.", @"Other", nil];
}
テーブル ビューでは、 my の属性を反復処理します(NSManagedObject
を使用し、属性ごとに、適切な "stringsFor" メソッドを呼び出すヘルパー メソッドを呼び出して、その特定の属性の文字列を返します。NSEntityDescription
attributesByName
-(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を使用しています。これをさらにデバッグするにはどうすればよいですか?