effective objc 阅读笔记:ch5 &ch6 &ch7

本文详细介绍了Objective-C中的内存管理,包括引用计数、ARC机制以及如何避免保留环。此外,探讨了块的概念、使用GCD进行多线程操作的优势,强调了在dealloc方法中正确释放资源的重要性。文章还提醒开发者注意在异常处理中内存管理的特殊性,并推荐使用僵尸对象调试内存问题。最后,作者建议熟悉系统框架,如使用块枚举优化循环,以及在构建缓存时选择NSCache而非NSDictionary。
摘要由CSDN通过智能技术生成

五、内存管理

第29条、理解引用计数

在 objc 中,对象具有计数器,保留一个引用计数值,当计数归零时,系统回收此对象,也就是说将此对象占据的内存标记为可重用;

当对象被回收时,若其内存还未被覆写,那么该对象仍然有效,为了避免不经意使用无效对象,一般 release 完之后需要设置指针值为 nil,避免出现“悬垂指针”;

NSNumber *number = [[NSNumber alloc] initWithInt:1337];
[array addObject:number];
[number release];
number = nil;

在属性存取方法中,setter 方法内的执行顺序为:保留新值、释放旧值、指向新值,可以避免 set 原值时出现的异常;

自动释放池:稍后递减计数,通常是下一次事件循环,而 release 是立即减少引用计数;

- (NSString*)stringValue {
  NSString *str = [[NSString alloc] initWithFormat:@"I am %@", self];
  return [str autorelease]
}

第30条、以 ARC 简化引用计数

ARC,自动引用计数,自动执行 retain,release,autorelease 操作,这些方法在 ARC 中不允许被手动调用,并且 ARC 在调用这些方法时,并不通过普通的 objc 消息派发机制,而是直接调用底层 C 语言版本,性能更好;

将内存管理语义和方法名关联是 objc 的惯例,若方法名以 alloc、new、copy、mutableCopy 开头,那么对象归调用者所有,负责释放方法所返回的对象;

+ (EOCPerson*)newPerson {
  EOCPerson *person = [[EOCPerson alloc] init];
  return person;
}

+ (EOCPerson*)somePerson {
  EOCPerson *person = [[EOCPerson alloc] init];
  // 在 ARC 中,实际运行的是 return [person autorelease];
  return person;
}

- (void)doSomething {
  EOCPerson *personOne = [EOCPerson newPerson];
  EOCPerson *personTwo = [EOCPerson somePerson];
  // 自动调用的是:
  // [personOne release]
}

ARC 还能将互相抵消的 retain、release 、autorelease 相互约简;

_myPerson = [EOCPerson personWithName:@"Bob Smith"];
// 等价于:
// EOCPerson *tmp = [EOCPerson personWithName:@"Bob Smith"];
// _myPerson = [tmp retain];
// 方法 personWithName 的 autorelease 与 tmp 的 retain 可以相互抵消;

应用程序中,可以通过下列修饰符改变局部变量或实例变量的语义,

__strong: 默认语义
__unsafe_unretained: 不使用内存管理
__weak: 不保留对象,当对象被回收,值变为空
__autoreleasing: 当对象被按引用传递时,此值在方法返回时自动释放

使用修饰符打破保留环:

EOCNetworkFetcher * __weak weakFetcher = fetcher;
[fetcher startWithCompletion:^(BOOL success) {
  NSLog(@"Finished fetching from %@", weakFetcher.url);
}];

ARC 负责对实例变量进行内存管理,dealloc 方法会被自动调用,同时该方法会自动调用父类的 dealloc,由于 ARC 只负责管理 objc 对象的内存,所以 CoreFoundation 对象与 C 语言声明的内存,需要开发者释放;

- (void)dealloc {
  CFRelease(_coreFoundationObject)
  free(_heapAllocateMemoryBlob)
}

第31条、在 dealloc 方法中只释放引用并解除监听
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值