继承和转换返回类型

时间:2014-02-01 16:37:28

标签: ios objective-c

我有一个子类ParseChild,它继承自父类PFObject:

ParseChild.h

@interface ParseChild : PFObject

+(void)findAllWithCompletion:(void(^)(ParseChild *child))handler;

@end

ParseChild.m (findAllWithCompletion返回一个PFObjects数组)。

@implementation ParseChild

+(void)findAllWithCompletion:(void(^)(ParseChild *child))handler {
    PFQuery *query = [PFQuery queryWithClassName:@"TagRelationship"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *children, NSError *error) {
       ParseChild *child = (ParseChild *) children[0];
       handler(child);
    }];
}

-(void)deleteWithCompletion:(void (^)(BOOL succeeded))handler {
    [self deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        handler(succeeded);
    }];
}

}

然后我在viewcontroller中调用findAllWithCompletion方法:

[ParseChild findAllWithCompletion:^(ParseChild *child) {
     [child deleteWithCompletion:^(BOOL succeeded) {
     }];       
}];

即使我将PFObject父实例转换为ParseChild(ParseChild * child =(ParseChild *)children [0];),它也会给我这个错误:

  

- [PFObject deleteWithCompletion:]:无法识别的选择器发送到实例0x16f77fa0。

我能做些什么来解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

仅仅因为你施放对象并不意味着你改变了对象的类型。你的PFQuery返回PFObjects。编译PFObject是为了响应选定数量的选择器,deleteWithCompletion不是其中之一。我认为你正在寻找更多的类别而不是子类的功能。

@implementation PFObject()
+(void)findAllWithCompletion:(void(^)(ParseChild *child))handler {
    PFQuery *query = [PFQuery queryWithClassName:@"TagRelationship"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *children, NSError *error) {
       PFobject *child = children[0];
       handler(child);
    }];
}

-(void)deleteWithCompletion:(void (^)(BOOL succeeded))handler {
    [self deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        handler(succeeded);
    }];
}

@end

答案 1 :(得分:0)

我认为,您应该尝试使用 ID类型 而不是类名。 Look here

您还可以按照此post

中的说明进行类型检查

希望有所帮助。

答案 2 :(得分:0)

在这种情况下,如果您无法修改基类

,则首选类别而不是继承

<强> PFObject + Search.h

@interface PFObject (Search)
+(void)findAllWithCompletion:(void(^)(PFObject *child))handler;
-(void)deleteWithCompletion:(void (^)(BOOL succeeded))handler;
@end

<强> PFObject + Search.m

@implementation PFObject (Search)
+(void)findAllWithCompletion:(void(^)(PFObject *child))handler {
    PFQuery *query = [PFQuery queryWithClassName:@"TagRelationship"];
    [query findObjectsInBackgroundWithBlock:^(NSArray *children, NSError *error) {

        handler([children firstObject]);
    }];
}

-(void)deleteWithCompletion:(void (^)(BOOL succeeded))handler {
    [self deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
        handler(succeeded);
    }];
}
@end
相关问题