[英]How memory management will work in Model class(Swift or objective C)
我有一個具有以下屬性的模型類。
@interface CountryModel : NSObject
@property (nonatomic) NSInteger id;
@property (nonatomic, strong) NSString *country;
@property (nonatomic, strong) NSString *dialCode;
@property (nonatomic) BOOL isInEurope;
@end
我正在從網絡服務獲取以下數據。
{
"id": 123,
"country_name": "India",
"dialCode": "+91"
}
然后我將值綁定到數組,現在我的問題是內存管理如何為模型類工作? 因為很少有很強的參考性。 誰能給我解釋一下。
簡單回答:自動(前提是您沒有禁用 ARC)
稍微長一點的答案(前提是你沒有禁用 ARC):
當你的屬性值分配country
和dialCode
實例的CountryModel
那么該實例將要引用的強引用NSString
值。
如果您為這些屬性中的任何一個分配新值,則先前的強引用將被刪除並替換為對新值的強引用。
當CountryModel
的實例不再被任何東西強引用時,它所包含的強引用將被刪除。
當一個強引用被刪除時,如果沒有其他對該引用對象的強引用,則該對象變為可回收的,並且它占用的內存返回到可用內存池。
注意:如果一個NSString
引用引用一個文字串,那么這個文字串本身是不朽的,永遠不會被回收。 如果您試圖通過監視內存使用、跟蹤dealloc
調用等來了解何時釋放內存,請不要使用文字字符串作為測試對象——最好使用用戶定義的類型。
但是我已經禁用了 ARC...然后當您手動指示它時內存將被回收。 如果您遇到泄漏,打開 ARC是您的最佳選擇,如果您不能,那么您需要進行一些調試!
HTH
評論后的附錄
試圖遵循引用計數並期望它們與實際執行的代碼匹配並不能很好地工作,因為在編譯的代碼中經常有你不知道的引用。 出於這個原因,您會看到許多作者不鼓勵跟蹤引用計數。
相反,從強引用的角度考慮使對象擁有所有權,並且只要存在所有者,對象就會存在。
這可能看起來本質上是一回事,但在看待兩者的方式上存在細微差別:引用計數屬於對象; 而strong
引用屬性,它斷言所有權,是屬於引用變量的一部分。
在您的評論示例中, a
在它引用的CountryModel
對象中擁有所有權權益 - 您迄今為止為該對象創建的唯一所有權權益。 CountryModel
對象在country
和dialcode
引用的對象中擁有所有權股份,但可能不是唯一的此類利益相關者 - 在該片段中,我們不知道還有哪些其他引用變量在這兩個變量引用的對象中聲明所有權股份。
稍后,當您創建temparray
,存儲在a
的對象引用被復制到引用的CountryModel
對象中的數組和temparray
聲明和所有權權益中 - 同時a
繼續聲明其自己的所有權權益。 因此,現在您創建了兩個變量來聲明CountryModel
對象中的所有權。
類似的解釋適用於b
& c
。
當對象上的任何變量/屬性都沒有聲明所有權時,可以銷毀該對象。 作為銷毀的一部分,屬於該對象的任何變量/屬性都將被銷毀,並且它們對存儲在其中的引用所主張的任何所有權權益都將被撤回。
如果這個過程導致更多的對象不再擁有更多的所有權,那么這些對象也可以被銷毀; 該過程繼續銷毀不需要的對象,直到唯一剩余的對象是某些變量/屬性對其擁有所有權的對象。
HTH 比它更令人困惑!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.