我在下面的链接中遇到了类似的问题。
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编程的新手,这真让我难过。任何帮助将不胜感激。
答案 0 :(得分:0)
确保正在编译类别的实现文件(NSSetFunctional.m)并将其链接到目标。有几种方法可以验证这一点,但简单的方法是在Xcode中选择该文件,打开Utilities抽屉(右侧&#39;侧栏&#39;),然后选择文件检查器(页面图标)。根据&#34;目标会员资格&#34;确保选中应用目标旁边的框。
如果未选中此选项,则这些类别方法的实现不会包含在已编译的二进制文件中,并且您将完全得到您描述的错误。