@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
這就要扯到堆和棧的問題了,基本數據類型會被分配到棧空間,而棧空間是由系統自動管理分配和釋放的,就不會形成野指針的問題github
容器類概念:NSArray、NSDictionary、NSSet爲容器類型的對象指針
非容器類總結code
對象類型 | 不可變對象 | 可變對象 |
---|---|---|
copy | 淺拷貝 | 深拷貝 |
mutableCopy | 深拷貝 | 深拷貝 |
對象類型 | 不可變對象 | 可變對象 |
---|---|---|
copy | 淺拷貝 | 深拷貝 |
mutableCopy | 深拷貝 | 深拷貝 |
附:個人博客地址對象