我有一个排序比较器,我需要在几个不同的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
有干净的方法吗?
答案 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
命名约定来提醒我,当我完成它时,我必须自己释放该对象。