我试图通过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)
我已仔细检查是否已添加脚本桥框架,并且iTunesTrack + dictionary.m文件已附加到目标。将类别与Scripting Bridge结合使用会出现一些错误吗?
更新:
如果我用SBObject替换iTunesTrack,则可以。我不知道为什么。
更新2:
此问题是可重现的:
建立新专案
添加脚本桥框架和iTunes.h头文件。
使用任意名称创建iTunesTrack的新类别
确保
iTunesTrack+name.h
导入iTunes.h
建立
我发现this page描述了使用NSProxy和NSCache存储iTunesTrack对象。与尝试创建类别相比,这会是更好的解决方案吗?
最佳答案
脚本桥相当混乱。
实际上,类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
上可用,因此请确保所有属性和方法都具有唯一的接口。