我试图通过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上可用,因此请确保所有属性和方法都具有唯一的接口。

09-25 20:52