2013-07-09 61 views
0

我有聲明瞭一個用戶,並且包括這些變量的類:Xcode中:@dynamic類變量不工作

(User.h文件):

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * unid; 

(User.m文件):

@dynamic name; 
@dynamic unid; 

我有一個解析字符串值的數組。 我再要設置相應的值:

(ViewController.m文件):

[user setName:[returned objectAtIndex:1]]; 
[user setUnid:[returned objectAtIndex:2]]; 

當此運行編譯器給了我以下錯誤:

unrecognized selector sent to instance 
*** WebKit discarded an uncaught exception in the webView:shouldInsertText:replacingDOMRange:givenAction: delegate: <NSInvalidArgumentException> -[User setName:]: unrecognized selector sent to instance 

當我發表評論出setName行它工作正常。

我然後看着從返回的數組的兩個對象的類和它們都是:__NSCFString

我然後試圖這段代碼:

(ViewController.m文件):

[user setName:[returned objectAtIndex:2]]; 

再次發生同樣的錯誤。

爲什麼同一輸入在一種情況下會失敗並在另一個輸入中成功?如果他們都期待相同的輸入?

謝謝。

編輯:

此錯誤是不可思議的應用程序,這部分不與任何網頁視圖進行交互。這個返回的數組是從一個字符串解析收集來自網頁:

(ViewController.m文件):

NSString *string = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://url_goes_here.com" encoding:NSUTF8StringEncoding error:&error]; 
NSArray *returned = [returned componentsSeparatedByString:@"#"]; 

然而,UNID也從這個陣列分析沒有任何問題。

+0

爲什麼你使用「'@ dynamic」「而不是」'@ synthesize'「? –

+0

它實際上是一個由xcode使用核心數據的NSManagedObject子類設置的類。 – carloabelli

回答

3

@dynmaic關鍵字表示您將自己提供訪問器。如果您希望編譯器爲您創建訪問器,只需刪除@dynamic name聲明。 (因爲@synthesize現在是默認值,所以您不必明確使用它。)否則,您需要自己創建-name-setName:-unid-setUnid:方法。

it is actually a set up class by xcode using the NSManagedObject subclass for core data

這是一個重要的細節。對於託管對象,Core Data將爲您提供訪問器,您只需要使用@dynamic屬性聲明讓編譯器知道它本身不應生成訪問器。

我有點困惑,爲什麼這個錯誤來自網絡視圖委託方法。如果你可以更多地解釋你的Core Data類如何與Web視圖交互,這可能會有所幫助。

why would this work for the unid, but not the name

您收到的錯誤是運行時錯誤 - 正在拋出異常。很可能name訪問者只是第一個使用的訪問者;如果該屬性是首先設置的,則unid可能會發生同樣的情況。

This error is weird as this part of the app does not interact with any webviews.

另一個重要的線索。在這一點上,這聽起來很像你有一個糟糕的指針。您正在將-setName:發送給您認爲不是您想要的對象,並且在這種情況下,它變成了Web視圖委託。嘗試打開NSZombies來幫助你追蹤這個。

+0

使用綜合所有他們的作品,但爲什麼會動態工作單身,但不是名稱。 – carloabelli

+0

'@ dynamic'不同之處在於它需要某個地方的定義,它不一定要在當前的類中。例如,從模型生成的所有NSManagedObject都是'@ dynamic',因爲編譯器會爲其屬性生成訪問器。把'@ dynamic'想象成動態的'extern' – CodaFi

+0

更新了這個問題。是的'@ synthesize'的問題是它沒有加載變量。 – carloabelli