我有一个类似下面链接的问题。
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中选择该文件,打开工具抽屉(右侧"侧边栏"),并选择文件检查器(页面图标)。在"目标会员"下,确保你的应用程序目标旁边的框被选中。
如果不选中此选项,则这些类别方法的实现将不会包含在编译的二进制文件中,并且您将得到您所描述的错误。