Objective-C函数指针块属性

时间:2013-01-24 01:04:35

标签: objective-c properties automatic-ref-counting function-pointers objective-c-blocks

我正在尝试在Objective-C中实现类似于C#委托概念的东西。我认为它可以完成,但我正在努力使其发挥作用。我为我的块设置了一个类型def:

typedef BOOL (^CompareBlock)(id obj1, id obj2);

我也有一个类的属性:

@property (nonatomic, copy) CompareBlock compareBlock;

我想要做的是在init方法中设置属性并引用预先存在的方法:

BOOL isGreaterThan(id obj1, id obj2)
{
     // perform some comparison

     return false;
}

- (id)init
{
    self = [super init];

    if (self)
        self.compareBlock = isGreaterThan;

    return self;
}

我知道这不是正确的语法,但我无法弄清楚如何实现这个概念。我已经尝试将函数转换为我定义的块typedef,但是错误说ARC不允许这样做。

有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

您的问题是您的compareBlock属性是一个块,而isGreaterThan是一个函数指针。这些不可互换。你想要的是这样做:

self.compareBlock = ^(id lhs, id rhs){ 
    /* compare here */
    return (BOOL)comparisonResult;
};

Blocks允许您在方法体中而不是在命名函数中声明比较器。如果你想真正使用你的isGreaterThan函数,你只需将它包装在一个块中,因此:

self.compareBlock = ^(id lhs, id rhs){ 
    return isGreaterThan(lhs,rhs);
};

答案 1 :(得分:0)

我找到了一种方法来实现我想用iluvcapra建议做的事情。我试图按照以前的方式做事的主要原因是为了整洁。我认为这种方法可以达到:

+ (CompareBlock) isGreaterThan
{
     return ^(id object1, id object2)
     {
         // perform some comparison

         return compareResult;
     }
}

- (id)init
{
    self = [super init];

    if (self)
        self.compareBlock = [MyClass isGreaterThan];

    return self;
}