单独文件中的NSComparator

时间:2011-08-15 14:44:52

标签: iphone objective-c ios objective-c-blocks

我有一个排序比较器,我需要在几个不同的ViewControllers中使用,所以我试图将它保存在一个单独的文件中。我已经读过我应该能够将排序块放在一个单独的文件中,但是我尝试过哪种方法我似乎得到了“无法识别的选择器发送到实例”。我的代码是:

#import <Foundation/Foundation.h>

typedef NSComparator (^IntBlock)(id obj1, id obj2);

@interface Utils : NSObject {
    NSComparator SortObjNameComparer;
    NSComparator SortObjPriceComparer;
}
@property (readwrite, copy) NSComparator SortObjNameComparer;
@property (readwrite, copy) NSComparator SortObjPriceComparer;

要对此进行排序我正在使用

Utils *comp = [[Utils alloc] init];
if(segmentedControl.selectedSegmentIndex == 0){
    self.productArray = [self.productArray sortedArrayUsingComparator:[comp SortObjNameComparer] context:nil];   //EXC_BAD_ACCESS     
} else if(segmentedControl.selectedSegmentIndex == 1){
    self.productArray = [self.productArray sortedArrayUsingComparator:[Utils SortObjPriceComparer]];// EXC_BAD_ACCESS

有干净的方法吗?

2 个答案:

答案 0 :(得分:3)

为什么将IntBlock声明为返回NSComparator的块,我认为你根本不需要它。此外,默认情况下还会在堆栈上分配块,因此请确保在初始化属性时正确执行此操作。如果您发布块的初始化,将有助于回答您的问题,但您的实现应该与此类似。

-(id)init
{
    if((self = [super init]))
    {
        //Make sure you use self.
        self.SortObjNameComparer = ^(id obj1, id obj2){ return NSOrderedSame; };
        self.SortObjPriceComparer = ^(id obj1, id obj2){ return NSOrderedSame; };
    }
    return self;
}

-(void)dellaoc
{
    Block_release(SortObjNameComparer);
    Block_release(SortObjPriceComparer);

    [super dealloc];
}

答案 1 :(得分:2)

另一种方法是创建一个返回块的C函数。这样你就可以在任何你喜欢的地方创建这个块:

e.g

<强> MyComparator.h

#import <Foundation/Foundation.h>

NSComparator CreateObjNameComparer(void);
NSComparator CreateObjPriceComparer(void);

<强> MyComparator.m

#import MyComparator.h

NSComparator CreateObjNameComparer(void) {
    NSComparator myComparator = ^(id obj1, id obj2) {
        // Your definition here
    };
    return Block_copy(myComparator);
}

NSComparator CreateObjPriceComparer(void) {
    NSComparator myComparator = ^(id obj1, id obj2) {
        // Your definition here
    };
    return Block_copy(myComparator);
}

然后你需要做的就是导入标题并将其用作:

NSComparator nameComparator = CreateObjNameComparor();
// Use the block
Block_release(nameComparator);

保存必须完成整个对象创建和属性路径。

请注意,我正在使用Create命名约定来提醒我,当我完成它时,我必须自己释放该对象。