ios - 内存管理如何在模型类(Swift 或目标 C)中工作
问题描述
我有一个具有以下属性的模型类。
@interface CountryModel : NSObject
@property (nonatomic) NSInteger id;
@property (nonatomic, strong) NSString *country;
@property (nonatomic, strong) NSString *dialCode;
@property (nonatomic) BOOL isInEurope;
@end
我正在从 Web 服务获取以下数据。
{
"id": 123,
"country_name": "India",
"dialCode": "+91"
}
然后我将值绑定到数组,现在我的问题是内存管理将如何为模型类工作?因为很少有很强的参考性。谁能给我解释一下。
解决方案
简单的答案:自动(前提是您没有禁用 ARC)
稍微长一点的答案(前提是您没有禁用 ARC):
当您将值分配给属性country
和dialCode
实例时,CountryModel
该实例将具有对引用NSString
值的强引用。
如果您为这些属性中的任何一个分配新值,则先前的强引用将被删除并替换为对新值的强引用。
当实例CountryModel
不再被任何东西强引用时,它包含的强引用将被删除。
当强引用被删除时,如果引用对象没有其他强引用,则该对象变为可回收的,并且它占用的内存返回到可用内存池。
注意:如果NSString
引用引用了文字字符串,则文字字符串本身是不朽的,永远不会被回收。dealloc
如果您试图通过监视内存使用情况、跟踪调用等来了解何时释放内存,请不要使用文字字符串作为测试对象——最好使用用户定义的类型。
但是我已经禁用了 ARC ......然后,当您手动指示它时,内存将被回收。如果您遇到泄漏,打开 ARC是您的最佳选择,如果您不能,那么您需要进行一些调试!
高温高压
评论后补充
试图遵循引用计数并期望它们与实际执行的代码相匹配并不能很好地工作,因为在编译的代码中经常有你不知道的引用。出于这个原因,您会看到许多作者不鼓励跟踪引用计数。
取而代之的是考虑在对象中建立所有权的强引用,只要有所有者,对象就可以生存。
这可能看起来本质上是一样的,但是在如何看待两者方面存在细微差别:引用计数属于对象;而strong
声明所有权权益的引用属性是属于引用变量的一部分。
在您的评论示例中,它引用a
的对象具有所有权权益CountryModel
- 您迄今为止为该对象创建的唯一所有权权益。对象在所引用的CountryModel
对象中拥有所有权,但可能不是唯一的此类利益相关者——在该片段中,我们不知道还有哪些其他引用变量在这两个变量引用的对象中声明所有权。country
dialcode
稍后,当您创建temparray
对象时,存储在其中的引用a
被复制到数组中,并temparray
声明和所有权权益在引用的CountryModel
对象中——同时a
继续声明其自己的所有权权益。所以现在你已经创建了两个变量来断言CountryModel
对象的所有权。
类似的解释适用于b
& c
。
当任何变量/属性对对象没有所有权权益时,该对象就可以被销毁。作为该销毁的一部分,作为该对象一部分的任何变量/属性都将被销毁,并且它们对存储在其中的引用所断言的任何所有权赌注都将被撤回。
如果该过程导致更多的对象没有更多的所有权权益,那么这些对象也可以被销毁;该过程继续销毁不需要的对象,直到唯一剩余的对象是某些变量/属性对其拥有所有权的对象。
HTH 比它更令人困惑!
推荐阅读
- c# - 将数据库中的二进制图像显示到网格视图中。
- node.js - 为生物医学应用设计后端和前端架构
- python - 从 CMake 运行 pytest 测试,其中测试和源位于不同的文件夹中
- c# - 在 for-each-loop 中等待异步调用
- ios8-today-widget - iOS:重启设备后今日小部件“无法加载”
- jquery - Laravel DELETE 表单外请求 - 获取数据
- python - 从现有的 ctypes.c_void_p 创建 numpy 数组
- java - 无法调用超类的方法
- c# - MediaElement.SetSource() 自动播放我的 MP3
- google-sheets - 带有包含通配符的标准的 Google 电子表格 SUMIF