[英]Xcode: @dynamic class variable not working
我有一個聲明用戶並包含以下變量的類:
(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]];
同樣是同樣的錯誤。
如果相同的輸入在一種情況下會失敗,而在另一種情況下都期望相同的輸入,那么為什么會在另一種情況下成功?
謝謝。
編輯:
該錯誤很奇怪,因為該應用程序的這一部分未與任何Web視圖進行交互。 這個返回的數組是從網頁中收集的字符串中解析出來的:
(ViewController.m文件):
NSString *string = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://url_goes_here.com" encoding:NSUTF8StringEncoding error:&error];
NSArray *returned = [returned componentsSeparatedByString:@"#"];
但是,unid也可以從該數組中解析出來,沒有任何問題。
@dynmaic
關鍵字意味着您將自己提供訪問器。 如果您希望編譯器為您創建訪問器,只需刪除@dynamic name
聲明。 (因為@synthesize
現在是默認值,因此您不必顯式使用它。)否則,您需要自己創建-name
, -setName:
,- -unid
和-setUnid:
方法。
它實際上是xcode使用NSManagedObject子類為核心數據設置的類
這是一個重要的細節。 對於托管對象,Core Data將為您提供訪問器,而您只需要@dynamic
屬性聲明即可讓編譯器知道它自己不應該生成訪問器。
對於為什么此錯誤來自Web視圖委托方法,我有些困惑。 如果您可以進一步解釋有關Core Data類如何與Web視圖交互的信息,則可能會有所幫助。
為什么對unid有用,但對名字無效
您得到的錯誤是運行時錯誤-引發異常。 name
訪問器可能只是第一個使用的name
訪問器; 如果首先設置該屬性,則對unid
可能會發生同樣的事情。
該錯誤很奇怪,因為該應用程序的這一部分未與任何Web視圖進行交互。
另一個重要線索。 在這一點上,聽起來很像是指針指向錯誤。 您正在將-setName:
發送到您認為不是的對象,在這種情況下,它實際上是Web視圖的委托。 嘗試啟用NSZombies,以幫助您跟蹤此情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.