iOS开发-特点的内存办理
Objective-C中,类的实例变量(instance variables)和特点(properties)是两种不同的概念,其间特点的内存办理就较为杂乱。Objective-C 供给了多种特点修饰符,用于办理目标的内存。这些修饰符用于操控目标的生命周期和内存办理行为。
以下是一些常见的特点修饰符及其内存办理行为的详细介绍:
1. strong
- 适用目标:一般用于目标类型(如
NSObject
及其子类)。 - 内存办理:
strong
特点会对目标进行强引证计数。当一个目标被赋值给一个strong
特点时,该目标的引证计数会添加 1。当这个特点被设置为nil
或目标被开释时,引证计数会削减 1。 - 生命周期:只需有一个
strong
引证指向目标,该目标就不会被开释。
示例
@property (nonatomic, strong) NSString *name;
在这个示例中,name
特点是一个 strong
引证,这意味着只需 name
特点指向的目标存在,引证计数就会添加,保证目标不会被开释。
2. weak
- 适用目标:一般用于目标类型,特别是在防止循环引证时。
- 内存办理:
weak
特点不会对目标进行强引证计数。当目标被开释时,weak
特点会主动设置为nil
,防止悬挂指针问题。 - 生命周期:
weak
引证不会延伸目标的生命周期。
示例
@property (nonatomic, weak) id<SomeDelegate> delegate;
在这个示例中,delegate
特点是一个 weak
引证,这意味着当 delegate
目标被开释时,delegate
特点会主动设置为 nil
。
3. assign
- 适用目标:一般用于根本数据类型(如
int
、float
、BOOL
)和非目标类型(如NSInteger
、CGFloat
)。 - 内存办理:
assign
特点不会对目标进行引证计数办理。它仅仅简略地赋值,不会添加或削减引证计数。 - 生命周期:假如
assign
特点指向一个目标,当该目标被开释时,assign
特点不会主动设置为nil
,可能会导致悬挂指针(dangling pointer)问题。
示例
@property (nonatomic, assign) NSInteger age;
在这个示例中,age
特点是一个 assign
引证,这意味着它仅仅简略地存储一个整数值,不触及引证计数办理。
4. copy
- 适用目标:一般用于需求不可变副本的目标类型(如
NSString
、NSArray
、NSDictionary
)。 - 内存办理:
copy
特点会对目标进行浅仿制或深仿制,详细取决于目标的完成。当一个目标被赋值给一个copy
特点时,会创立一个新的副本,并将其赋值给特点。 - 生命周期:
copy
引证会创立一个新的目标副本,保证特点持有的目标是独立的。
示例
@property (nonatomic, copy) NSString *name;
在这个示例中,name
特点是一个 copy
引证,这意味着当一个目标被赋值给 name
特点时,会创立一个新的副本,并将其赋值给 name
特点。
5. unsafe_unretained
- 适用目标:一般用于目标类型,但不引荐运用。
- 内存办理:
unsafe_unretained
特点不会对目标进行强引证计数。当目标被开释时,unsafe_unretained
特点不会主动设置为nil
,可能会导致悬挂指针问题。 - 生命周期:
unsafe_unretained
引证不会延伸目标的生命周期。
示例
@property (nonatomic, unsafe_unretained) id delegate;
在这个示例中,delegate
特点是一个 unsafe_unretained
引证,这意味着当 delegate
目标被开释时,delegate
特点不会主动设置为 nil
,可能会导致悬挂指针问题。
总结
strong
:用于目标类型,添加引证计数,保证目标不会被开释。weak
:用于目标类型,不添加引证计数,当目标被开释时,特点主动设置为nil
。assign
:用于根本数据类型和非目标类型,不触及引证计数办理。copy
:用于需求不可变副本的目标类型,创立目标的副本。unsafe_unretained
:用于目标类型,但不引荐运用,不添加引证计数,当目标被开释时,特点不会主动设置为nil
。
了解这些特点修饰符的差异才干更好地办理内存,防止内存走漏和悬挂指针问题。