objective-c - 将问题与 Scripting Bridge 上的类别链接

标签 objective-c cocoa objective-c-category scripting-bridge

我正在尝试在 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:

这个问题是可以重现的:

  1. 创建新项目
  2. 添加脚本桥框架和 iTunes.h 头文件。
  3. 使用任意名称创建 iTunesTrack 的新类别
  4. 确保 iTunesTrack+name.h 导入 iTunes.h
  5. 构建

我找到了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/

相关文章:

objective-c - 如何确定 Apple 方法是否异步?

objective-c - 如何覆盖 NSWindow?

ios - 何时使用 Categories Objective-C?

Objective-C 类别性能

objective-c - 错误 : CoreData: error: Failed to call designated initializer on NSManagedObject class 'Product'

iphone - 在 Objective-C 中,如何安全地从一个线程填充数组,同时在另一个线程中读取数组?

iphone - 向已释放的对象发送消息?

objective-c - 将按钮状态 (isEnabled) 与 NSUserDefaults 中的数组状态绑定(bind)

objective-c - 在 Objective-C 中覆盖类别定义的方法是否安全?

iPhone 换出 UIView/Sub view 的内容