2013-05-06 53 views
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相結合可能會導致一些錯誤嗎?


更新:

如果我SBObject取代iTunesTrack,這個工程。不過,我不知道爲什麼。


更新2:

這個問題是重複性:

  1. 創建新項目
  2. 添加腳本橋框架和iTunes.h頭文件。
  3. 一個任意名稱
  4. 創建iTunesTrack的新類別確保iTunesTrack+name.h進口iTunes.h
  5. 構建

我發現this page其描述使用NSProxy和NSCache存儲iTunesTrack對象。這是否比嘗試製作類別更好?

回答

-2

你會發現在這個討論了答案: linker command failed with exit code 1 (use -v to see invocation)

你也可以嘗試乾淨,然後重新編譯項目或轉到項目 - >構建設置 - >有效的體系結構,並檢查是否有正確的。其中一些建議可能會對您有所幫助。

+0

我試過清洗。我也試着製作一個全新的項目,只添加了iTunes.h和Scripting Bridge,但仍然失敗。 – abroekhof 2013-05-06 15:11:48

1

腳本橋是相當混亂的。

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,所以一定要確保所有的屬性和方法有獨特的界面。

+0

NSAddict的答案指出了做我一直想要的東西的方式:實現 - (id)debugQuickLookObject;爲SBObject類。 – 2016-03-19 03:10:05

1

您不能在iTunesTrack(或ITunesTrack,或者您的頭文件中調用的任何類別)上添加一個類別,因爲這需要類在鏈接時存在,而且它不會:腳本橋動態創建目標應用程序的類在運行時。 (並且它們在技術上具有任意名稱,這就是爲什麼存在-classForScriptingClass的原因。)仍然可以向生成的類添加一個方法,但這意味着需要關注運行時,這通常比它的價值更麻煩。只需將您的類別方法放在SBObject上,並儘量小心。

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