记录学习过程,做好笔记。
内存管理
ARC 管理
ARC 管理下,一般情况下,无需手动管理内存。
需要注意的是,防止出现循环引用。此时可使用弱引用来解决。
1 | @property (weak) NSString *str; |
手动管理
在OC 1.0时,需要手动调用 release
来进行触发。
在使用 CoreFoundation
对象中,使用 CFRelease(str)
。
内容释放通知
1 | - (void)dealloc { |
变量在 ARC 和手动管理下转换
__bridge
不修改内存管理方式__bridge_retained
修改为手动管理__bridge_transfer
修改为 ARC 管理
1 | NSString *str1 = @"apple"; |
@property
1 | @property (weak) NSString *str; |
OC对象:默认修饰符是 strong
非OC对象:默认修饰符是 assign
assign
可以修饰 OC 对象,也可以修饰非 OC 对象,均表示弱引用(引用计数不增加)
内存回收后,weak
的对象返回 nil,assign
的对象返回原始值
KVC
通过 setValue: forKey:
快速赋值:
1 | - (instancetype)initWithDict:(NSDictionary *)dict { |
赋值时,对于不存在的 key,则会调用 setValue: forUndefinedKey:
:
1 | - (void)setValue:(id)value forUndefinedKey:(NSString *)key { |
读取时候,不存在 key,则会调用 valueForUndefinedKey:
:
1 | - (id)valueForUndefinedKey:(NSString *)key { |
读取嵌套对象
1 | Address *addr = [[Address alloc] initWithProvince:@"北京" city:@"北京" county:@"东城区"]; |
KVC集合操作:
1 | NSMutableArray *arr = [NSMutableArray array]; |
支持的5种语法:
1 | [arr valueForKeyPath:@"@avg.age"]; |