2

関連するオブジェクト (NSMutableDictionary および NSNumber) を使用して、iTunesTrack にカテゴリを書き込もうとしています。

#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 ファイルがターゲットに添付されていることを再確認しました。これは、カテゴリと Scripting Bridge を組み合わせる際のエラーでしょうか?


アップデート:

iTunesTrack を SBObject に置き換えると、これが機能します。理由はわかりませんが。


更新 2:

この問題は再現可能です:

  1. 新しいプロジェクトを作成
  2. Scripting Bridge Framework と iTunes.h ヘッダー ファイルを追加します。
  3. 任意の名前で iTunesTrack の新しいカテゴリを作成します
  4. iTunesTrack+name.hインポートを確認するiTunes.h
  5. 建てる

NSProxy と NSCache を使用して iTunesTrack オブジェクトを保存する方法について説明しているこのページを見つけました。これは、カテゴリを作成しようとするよりも優れた解決策でしょうか?

4

4 に答える 4

0

NSAddict の回答は、私がずっと望んでいたことを行う方法を示していました。それは、SBObject 型に debugQuickLookObject を実装して、デバッグを容易にすることです。iTunesTrack と iTunesArtwork を行うカテゴリは次のとおりです。

//  SBObject+Extensions.h

@import ScriptingBridge;

@interface SBObject (Extensions)

- (id)debugQuickLookObject;

@end


//  SBObject+Extensions.m

#import "iTunes.h"

@implementation SBObject (Extensions)

- (id)debugQuickLookObject
{
    NSString *className = self.className;

    if ([className isEqualToString:@"ITunesTrack"])
    {
        return [self handleITunesTrack];
    }
    else if ([className isEqualToString:@"ITunesArtwork"])
    {
        return [self handleITunesArtwork];
    }

    return [self description];
}

- (NSString*)handleITunesTrack
{
    iTunesTrack *track = (iTunesTrack *)self;

    NSMutableString *s = [NSMutableString new];

    [s appendFormat:@"Title:    %@\n", track.name];
    [s appendFormat:@"Artist:   %@\n", track.artist];
    [s appendFormat:@"Album:    %@\n", track.album];
    [s appendFormat:@"Duration: %f seconds\n", track.duration];

    return s;
}

- (NSImage*)handleITunesArtwork
{
    iTunesArtwork *artwork = (iTunesArtwork *)self;

    NSData *data   = [artwork rawData];
    NSImage *image = [[NSImage alloc] initWithData:data];

    return image;
}

@end
于 2016-03-19T03:18:51.363 に答える
-2

このディスカッションで答えを見つけることができます: リンカー コマンドが終了コード 1 で失敗しました (呼び出しを確認するには -v を使用してください)

また、プロジェクトをきれいにしてから再構築するか、[プロジェクト] -> [ビルド設定] -> [有効なアーキテクチャ] に移動して、すべてが正しいかどうかを確認することもできます。これらのアドバイスのいくつかはあなたを助けるかもしれません.

于 2013-05-06T15:01:48.033 に答える