簡體   English   中英

Xcode:@dynamic類變量不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM