iOS开辟-属性的内存管理

打印 上一主题 下一主题

主题 795|帖子 795|积分 2385

Objective-C中,类的实例变量(instance variables)和属性(properties)是两种不同的概念,其中属性的内存管理就较为复杂。Objective-C 提供了多种属性修饰符,用于管理对象的内存。这些修饰符用于控制对象的生命周期和内存管理行为。
以下是一些常见的属性修饰符及其内存管理行为的详细先容:
1. strong


  • 适用对象:通常用于对象类型(如 NSObject 及其子类)。
  • 内存管理:strong 属性会对对象进行强引用计数。当一个对象被赋值给一个 strong 属性时,该对象的引用计数会增加 1。当这个属性被设置为 nil 或对象被释放时,引用计数会减少 1。
  • 生命周期:只要有一个 strong 引用指向对象,该对象就不会被释放。
示例
  1. @property (nonatomic, strong) NSString *name;
复制代码
在这个示例中,name 属性是一个 strong 引用,这意味着只要 name 属性指向的对象存在,引用计数就会增加,确保对象不会被释放。
2. weak


  • 适用对象:通常用于对象类型,特别是在制止循环引用时。
  • 内存管理:weak 属性不会对对象进行强引用计数。当对象被释放时,weak 属性会自动设置为 nil,制止悬挂指针问题。
  • 生命周期:weak 引用不会延伸对象的生命周期。
示例
  1. @property (nonatomic, weak) id<SomeDelegate> delegate;
复制代码
在这个示例中,delegate 属性是一个 weak 引用,这意味着当 delegate 对象被释放时,delegate 属性会自动设置为 nil。
3. assign


  • 适用对象:通常用于基本数据类型(如 int、float、BOOL)和非对象类型(如 NSInteger、CGFloat)。
  • 内存管理:assign 属性不会对对象进行引用计数管理。它只是简单地赋值,不会增加或减少引用计数。
  • 生命周期:如果 assign 属性指向一个对象,当该对象被释放时,assign 属性不会自动设置为 nil,可能会导致悬挂指针(dangling pointer)问题。
示例
  1. @property (nonatomic, assign) NSInteger age;
复制代码
在这个示例中,age 属性是一个 assign 引用,这意味着它只是简单地存储一个整数值,不涉及引用计数管理。
4. copy


  • 适用对象:通常用于需要不可变副本的对象类型(如 NSString、NSArray、NSDictionary)。
  • 内存管理:copy 属性会对对象进行浅复制或深复制,详细取决于对象的实现。当一个对象被赋值给一个 copy 属性时,会创建一个新的副本,并将其赋值给属性。
  • 生命周期:copy 引用会创建一个新的对象副本,确保属性持有的对象是独立的。
示例
  1. @property (nonatomic, copy) NSString *name;
复制代码
在这个示例中,name 属性是一个 copy 引用,这意味着当一个对象被赋值给 name 属性时,会创建一个新的副本,并将其赋值给 name 属性。
5. unsafe_unretained


  • 适用对象:通常用于对象类型,但不保举使用。
  • 内存管理:unsafe_unretained 属性不会对对象进行强引用计数。当对象被释放时,unsafe_unretained 属性不会自动设置为 nil,可能会导致悬挂指针问题。
  • 生命周期:unsafe_unretained 引用不会延伸对象的生命周期。
示例
  1. @property (nonatomic, unsafe_unretained) id delegate;
复制代码
在这个示例中,delegate 属性是一个 unsafe_unretained 引用,这意味着当 delegate 对象被释放时,delegate 属性不会自动设置为 nil,可能会导致悬挂指针问题。
总结


  • strong:用于对象类型,增加引用计数,确保对象不会被释放。
  • weak:用于对象类型,不增加引用计数,当对象被释放时,属性自动设置为 nil。
  • assign:用于基本数据类型和非对象类型,不涉及引用计数管理。
  • copy:用于需要不可变副本的对象类型,创建对象的副本。
  • unsafe_unretained:用于对象类型,但不保举使用,不增加引用计数,当对象被释放时,属性不会自动设置为 nil。
理解这些属性修饰符的区别才气更好地管理内存,制止内存走漏和悬挂指针问题。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表