iOS copy相關

  1. strong和copy的區別 當咱們用@property來聲明屬性變量時,編譯器會自動爲咱們生成一個如下劃線加屬性名命名的實例變量(@synthesize copyyStr = _copyyStr),而且生成其對應的getter、setter方法。當咱們用self.copyyStr = originStr賦值時,會調用coppyStr的setter方法,而_copyyStr = originStr賦值時給_copyyStr實例變量直接賦值,並不會調用copyyStr的setter方法,而在setter方法中有一個很是關鍵的語句 _copyyStr = [copyyStr copy];

結論:用self.copyyStr = originStr 賦值時,調用copyyStr的setter方法,setter方法對傳入的copyyStr作了次深拷貝生成了一個新的對象賦值給_copyyStr,因此_copyyStr指向的地址和對象值都再也不和originStr相同git

  1. assign與weak
  • assign用來修飾基本數據類型,weak用來修飾OC對象
  • assign也能修飾OC對象,可是assign修飾的對象在該對象釋放後,其指針依然存在,不會被置爲nil,這就形成了一個很嚴重的問題:出現了野指針。當訪問這個野指針時,指向了原地址,若是原地址被回收,就會形成程序的crash
  • 用weak來修飾的話,對象釋放的時候會把指針置爲nil,從而避免了野指針的出現
  1. 基本數據類型爲何能夠使用assign

這就要扯到堆和棧的問題了,基本數據類型會被分配到棧空間,而棧空間是由系統自動管理分配和釋放的,就不會形成野指針的問題github

  1. copy和mutableCopy
  • 容器類概念:NSArray、NSDictionary、NSSet爲容器類型的對象指針

  • 非容器類總結code

對象類型 不可變對象 可變對象
copy 淺拷貝 深拷貝
mutableCopy 深拷貝 深拷貝
  • 容器類型總結
對象類型 不可變對象 可變對象
copy 淺拷貝 深拷貝
mutableCopy 深拷貝 深拷貝

附:個人博客地址對象

相關文章
相關標籤/搜索