面试题答案
一键面试联系与影响
- ARC环境
- 接口与实现联系紧密:在ARC环境下,编译器会自动处理对象的内存管理。无论是在接口文件声明属性还是在实现文件合成属性,编译器会根据属性的修饰符(如
strong
、weak
、copy
等)来自动插入合适的内存管理代码。例如,声明为strong
的属性,在对象被赋值时,编译器会自动生成保留新值并释放旧值的代码;声明为weak
的属性则不会增加对象的引用计数。 - 一致性:从内存管理角度,接口和实现的操作本质上是由编译器统一处理,开发者无需手动编写引用计数相关代码,只要在声明属性时选择合适的修饰符,内存管理行为就会在整个类的使用过程中保持一致。
- 接口与实现联系紧密:在ARC环境下,编译器会自动处理对象的内存管理。无论是在接口文件声明属性还是在实现文件合成属性,编译器会根据属性的修饰符(如
- MRC环境
- 手动控制要求高:在MRC环境下,开发者需要手动管理对象的引用计数。接口文件声明属性和在实现文件合成属性时,开发者都要负责编写合适的
retain
、release
和autorelease
代码。例如,在设置strong
语义类似的属性时,需要手动retain
新值并release
旧值。 - 接口声明影响实现:接口文件中属性的声明方式(如
assign
、retain
、copy
等)决定了在实现文件中内存管理的具体操作。如果声明为retain
,在实现中设置属性值时就需要retain
新对象并release
旧对象;如果是assign
,则不需要改变引用计数,通常用于基本数据类型。
- 手动控制要求高:在MRC环境下,开发者需要手动管理对象的引用计数。接口文件声明属性和在实现文件合成属性时,开发者都要负责编写合适的
声明与合成属性在内存管理上的不同表现
- ARC环境
- 声明属性:仅仅是定义了属性的特性,如修饰符等,编译器会根据这些特性自动在合适的地方插入内存管理代码。例如
@property (nonatomic, strong) NSString *myString;
,编译器会在设置myString
属性值时,自动保留新的NSString
对象并释放旧的对象。 - 合成属性:
@synthesize
指令在ARC下主要是让编译器自动生成属性的存取方法。这些存取方法中的内存管理代码同样由编译器根据属性声明的修饰符自动生成。例如,对于上述myString
属性,合成的setMyString:
方法会包含合适的内存管理操作,和声明属性时设定的strong
修饰符相匹配。
- 声明属性:仅仅是定义了属性的特性,如修饰符等,编译器会根据这些特性自动在合适的地方插入内存管理代码。例如
- MRC环境
- 声明属性:声明属性时指定的内存管理特性(如
retain
、assign
、copy
)直接决定了在实现文件中需要手动编写的内存管理代码。例如声明@property (nonatomic, retain) NSObject *myObject;
,意味着在实现setMyObject:
方法时,需要手动retain
新传入的对象并release
旧的对象。 - 合成属性:使用
@synthesize
合成属性时,编译器会生成默认的存取方法框架。开发者仍需根据属性声明的内存管理特性在这些存取方法中手动编写引用计数操作代码。例如,对于@property (nonatomic, retain) NSObject *myObject;
合成的setMyObject:
方法,开发者需要手动添加retain
和release
代码来正确管理myObject
的引用计数。
- 声明属性:声明属性时指定的内存管理特性(如