Objective C中的类别不起作用

时间:2014-03-26 15:02:39

标签: ios objective-c-category nsset coreparse

我在下面的链接中遇到了类似的问题。

Categories in Objective-C aren't working

我是Objective C的新手,所以请原谅无知。我需要在我的项目中支持主题,并且我找到了这个有趣的解决方案(https://github.com/tombenner/nui),我正在尝试将其集成到我的解决方案中。我按照nui页面上的安装说明中的说明集成了项目。该软件依赖于CoreParse,需要将其作为子项目添加到您的应用程序中。我做到了。

文件夹结构如下:

--CODE
   --CoreParse
   --MyApp
       -ExternalProjects

我将Coreparse项目文件拖到我项目中的ExternalProject子文件夹中。

当我运行项目时,我不断收到“无法识别的选择器发送到实例0x81b42e0”这样的消息,我通过简单地将所有类别代码组合到父类中来修复。

现在我再次遇到同样的错误,只是这次它在Apple库中的NSSet类的类别扩展中,所以我的组合解决方案是不够的。

我得到的错误是:

2014-03-26 11:16:16.358 MomApp [1409:c07] - [__ NSSetM cp_map:]:无法识别的选择器发送到实例0x81b0210

当我对错误做“po”时,我得到以下内容:

po 0x81b0210 $0 = 139762688 {( (null) ::= • )}

编辑: 调用它的代码来自我在github上下载的包(CoreParse)

    while ([processingQueue count] > 0)
{
    NSSet *kernel = [processingQueue objectAtIndex:0];
    NSSet *itemSet = [self lr0Closure:kernel];
    //The next line causes the error
    NSSet *validNexts = [itemSet cp_map:^ id (CPItem *item) {return [item nextSymbol];}];

    for (CPGrammarSymbol *s in validNexts)
    {
        NSSet *g = [self lr0GotoKernelWithItems:itemSet symbol:s];
        if (![c containsObject:g])
        {
            [processingQueue addObject:g];
            [c addObject:g];
        }
    }

    [processingQueue removeObjectAtIndex:0];
}

此扩展程序所在的.h和.m文件如下所示: .h文件

//
//  NSSetFunctional.h
//  CoreParse
//
//  Created by Tom Davie on 06/03/2011.
//  Copyright 2011 In The Beginning... All rights reserved.
//

#import <Foundation/Foundation.h>


@interface NSSet(Functional)

- (NSSet *)cp_map:(id(^)(id obj))block;

@end

.m文件

//
//  NSSetFunctional.m
//  CoreParse
//
//  Created by Tom Davie on 06/03/2011.
//  Copyright 2011 In The Beginning... All rights reserved.
//

#import "NSSetFunctional.h"
#import <Foundation/Foundation.h>


@implementation NSSet(Functional)

- (NSSet *)cp_map:(id(^)(id obj))block
{
    NSUInteger c = [self count];
    id *resultingObjects = malloc(c * sizeof(id));

    NSUInteger nonNilCount = 0;
    for (id obj in self)
    {
        id r = block(obj);
        if (nil != r)
        {
            resultingObjects[nonNilCount] = r;
            nonNilCount++;
        }
    }

    NSSet *s = [NSSet setWithObjects:resultingObjects count:nonNilCount];
    free(resultingObjects);
    return s;
}

@end

我不知道如何让它发挥作用。正如我所说的,我是IOS编程的新手,这真让我难过。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

确保正在编译类别的实现文件(NSSetFunctional.m)并将其链接到目标。有几种方法可以验证这一点,但简单的方法是在Xcode中选择该文件,打开Utilities抽屉(右侧&#39;侧栏&#39;),然后选择文件检查器(页面图标)。根据&#34;目标会员资格&#34;确保选中应用目标旁边的框。

如果未选中此选项,则这些类别方法的实现不会包含在已编译的二进制文件中,并且您将完全得到您描述的错误。