我正在尝试在 iTunesTrack 上编写一个带有关联对象(一个 NSMutableDictionary 和一个 NSNumber)的类别
#import "iTunes.h"
#import <objc/runtime.h>
@interface iTunesTrack (dictionary)
- (NSMutableDictionary*) getDictionary;
- (NSNumber*) getScan;
- (BOOL)scanTrack:(NSString *)equationString;
@end
这失败了:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_iTunesTrack", referenced from:
l_OBJC_$_CATEGORY_iTunesTrack_$_dictionary in iTunesTrack+dictionary.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我已经仔细检查了 Scripting Bridge 框架是否已添加,并且 iTunesTrack+dictionary.m 文件是否已附加到目标。这可能是类别与脚本桥结合时出现的一些错误吗?
<小时/>更新:
如果我用 SBObject 替换 iTunesTrack,就可以了。但我不知道为什么。
<小时/>更新2:
这个问题是可以重现的:
- 创建新项目
- 添加脚本桥框架和 iTunes.h 头文件。
- 使用任意名称创建 iTunesTrack 的新类别
- 确保
iTunesTrack+name.h
导入iTunes.h
- 构建
我找到了this page其中描述了使用 NSProxy 和 NSCache 来存储 iTunesTrack 对象。这会是比尝试创建一个类别更好的解决方案吗?
最佳答案
Scripting Bridge 相当困惑。
iTunesTrack
类实际上在底层被称为 ITunesTrack
。
我认为它们与前导小写 i
不太一致。
这就是为什么他们在一段时间后更改了它,但可能不想在头文件中这样做,以免更改他们的 API。
我认为没有办法解决这个问题。
但是,您可以仅在 SBObject
上创建类别。
// The interface can be declared as iTunesTrack
@interface iTunesTrack (Additions)
...
@end
// The category MUST be implemented on SBObject
@implementation SBObject (Additions)
...
@end
<小时/>
注意
请注意,该类别在每个 SBObject
上都可用,因此请确保所有属性和方法都具有唯一的接口(interface)。
关于objective-c - 将问题与 Scripting Bridge 上的类别链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16401329/