*** 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,取決於修飾的類型是否有可變類型的子類。