1

重複の可能性:
'isMemberOfClass'は、カスタム初期化時に'NO'を返します

「isMemberOfClass」-メソッドに問題があります。

オブジェクトを生成して返すクラスがあります( " MyObject")

// ObjectFactory.h
...
-(MyObject*)generateMyObject;
...

// ObjectFactory.m
...
-(MyObject*)generateMyObject
{
    MyObject *obj = [[MyObject alloc]init];
    obj.name = @"Whatever";      // set properties of object
    return obj;
}
...

そして、generateMyObject-selectorを呼び出して返されたオブジェクトのクラスをチェックするunittest -classがあります。

...
ObjectFactory *factory = [[ObjectFactory alloc]init];
MyObject *obj = [factory generateMyObject];
if (![obj isMemeberOfclass:[MyObject class]])
    STFail(@"Upps, object of wrong class returned...");
else
...

-partが処理されることを期待していelseますが、代わりにSTFail(...)が呼び出されますが、なぜですか?

助けてくれてありがとう!よろしく、マトラウ

さて、これが元のコピー&ペーストされたコードです:

//testcase
- (void)test001_setCostumeFirstCostume
{
    NSString *xmlString = @"<Bricks.SetCostumeBrick><costumeData reference=\"../../../../../costumeDataList/Common.CostumeData\"/><sprite reference=\"../../../../..\"/></Bricks.SetCostumeBrick>";
    NSError *error;
    NSData *xmlData = [xmlString dataUsingEncoding:NSASCIIStringEncoding];
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData
                                                           options:0 error:&error];
    SetCostumeBrick *newBrick = [self.parser loadSetCostumeBrick:doc.rootElement];
    if (![newBrick isMemberOfClass:[SetCostumeBrick class]])
        STFail(@"Wrong class-member");
}

// "MyObject"
@implementation SetCostumeBrick
@synthesize indexOfCostumeInArray = _indexOfCostumeInArray;

- (void)performOnSprite:(Sprite *)sprite fromScript:(Script*)script
{
    NSLog(@"Performing: %@", self.description);

    [sprite performSelectorOnMainThread:@selector(changeCostume:) withObject:self.indexOfCostumeInArray waitUntilDone:true];
}

- (NSString*)description
{
    return [NSString stringWithFormat:@"SetCostumeBrick (CostumeIndex: %d)", self.indexOfCostumeInArray.intValue];
}

@end

// superclass of SetCostumeBrick
@implementation Brick
- (NSString*)description
{
    return @"Brick (NO SPECIFIC DESCRIPTION GIVEN! OVERRIDE THE DESCRIPTION METHOD!";
}

//abstract method (!!!)
- (void)performOnSprite:(Sprite *)sprite fromScript:(Script*)script
{
    @throw [NSException exceptionWithName:NSInternalInconsistencyException
                                   reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]
                                 userInfo:nil];
}
@end

// the "factory" (a xml-parser)
- (SetCostumeBrick*)loadSetCostumeBrick:(GDataXMLElement*)gDataSetCostumeBrick
{
    SetCostumeBrick *ret = [[SetCostumeBrick alloc] init];

    NSArray *references = [gDataSetCostumeBrick elementsForName:@"costumeData"];
    GDataXMLNode *temp = [(GDataXMLElement*)[references objectAtIndex:0]attributeForName:@"reference"];
    NSString *referencePath = temp.stringValue;

    if ([referencePath length] > 2)
    {
        if([referencePath hasSuffix:@"]"]) //index found
        {
            NSString *indexString = [referencePath substringWithRange:NSMakeRange([referencePath length]-2, 1)];
            ret.indexOfCostumeInArray = [NSNumber numberWithInt:indexString.intValue-1];
        }
        else 
        {
            ret.indexOfCostumeInArray = [NSNumber numberWithInt:0];
        }
    }
    else 
    {
        ret.indexOfCostumeInArray = nil;
        @throw [NSException exceptionWithName:NSInternalInconsistencyException
                                       reason:[NSString stringWithFormat:@"Parser error! (#1)"]
                                     userInfo:nil];
    }

    NSLog(@"Index: %@, Reference: %@", ret.indexOfCostumeInArray, [references objectAtIndex:0]);

    return ret;
}

解決:

Eiko / jrturtonからソリューションへのリンクが提供されました-thx:UIStoryboardからViewControllerがインスタンス化されると、isMemberOfClassはnoを返します

問題は、クラスが両方のターゲット(アプリとテストバンドル)に含まれていることでした

皆さんの助けに感謝します:)

4

2 に答える 2

2

通常、isMemberOfClassではなくisKindOfClass:が必要です。isKindOfClass:は、レシーバーが問題のクラスのサブクラスのメンバーである場合にYESを返しますが、isMemberOfClass:は、同じ場合にNOを返します。

if ([obj isKindOfClass:[MyObject class]])

例えば、

NSArray *array = [NSArray array];

ここで[array isMemberOfClass:[NSArray class]]はNO[array isKindOfClass:[NSArray class]]を返しますが、YESを返します。

于 2012-10-03T15:51:30.657 に答える
0

わかりました。コメントごとに異なるクラスアドレスを使用すると、これを追跡して、これと重複することができると思います。

ViewControllerがUIStoryboardからインスタンス化されると、isMemberOfClassはnoを返します。

基本的に、クラスは2回含まれます。

于 2012-10-03T19:00:16.870 に答える