iOS 程序報錯:reason: [NSArrayI addObject:]: unrecognized selector sent to instance


 

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x4b17be0'

 

錯誤:NSArray 不能使用 addObject:方法。可能是在程序運行的過程中,NSMutableArray轉為了NSArray。

解決方案:核查數組,看看是否在NSArray 之后使用了addObject:方法 。

 

延伸:copy屬性關鍵字的使用

 

iOS 開發中 copy 關鍵字的使用

在iOS開發中,一般copy關鍵字用在NSString、NSArray、NSDictionary等屬性字段的修飾符。

為什么上述屬性需要使用copy修飾呢?原因是上述屬性都有可變的子類,如 NSString->NSMutableString、NSArray->NSMutableArray、NSDictionary->NSMutableDictionary;根據面相對象的多態特性,NSString類型的變量可以指向NSMutableString類型的變量。聲明對象的屬性一般都是希望明確知道對象的值,但是如果對子類是可變類型的屬性使用strong修飾的話,可能會在對象不知情的情況下修改對象屬性的值,這肯定是對象不願意看到的,示例代碼如下:

 

 

 

圖一所示為創建的測試模型,有三個屬性,用strong修飾,下圖是對模型屬性賦值,進行打印的結果

 

 

從上邊打印結果可以看出,對象的屬性在不知情的情況下,內容已經被改變了,這會造成在訪問這個對象的時候,屬性值不正確的問題,嚴重的會導致程序崩潰(取數組的下標越界)。

如果使用copy修飾就不會有問題,示例代碼如下:

 

 

只是改變了屬性的修飾符,把strong改為了copy,打印結果如下:

 

 

從上圖可以看到,改為copy后,對象的屬性值,沒有因為可變對象值的改變而改變,這正是對象想要的。

所以,屬性的修飾符使用copy還是strong,取決於修飾的類型是否有可變類型的子類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM