目标C中的分类不起作用



我有一个类似下面链接的问题。

Objective-C中的分类不能工作

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

文件夹结构如下:

--CODE
   --CoreParse
   --MyApp
       -ExternalProjects

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

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

现在我又遇到了同样的错误,只是这次是在苹果库中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编程的新手,这真的让我难倒了。

确保类别的实现文件(nssetfunction .m)正在被编译并链接到您的目标。有几种方法可以验证这一点,但最简单的方法是在Xcode中选择该文件,打开工具抽屉(右侧"侧边栏"),并选择文件检查器(页面图标)。在"目标会员"下,确保你的应用程序目标旁边的框被选中。

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

最新更新