objc提供了两种内存管理的方法

1,MRR manual retain-release

2,  ARC Automatic Reference Counting

基本的内存管理法则:

1, 拥有任何创建的对象,例如new alloc copy等

2, 可以通过retain来获得对象的控制权

3, 当不再需要对象时必须释放

4, 不能释放没有控制权的对象

上面的例子中使用了alloc来获取了对象的控制权,在失去引用之前必须放弃拥有权。但是如果使用release,那么对象就会在return之前被释放掉,最终返回无效的对象。此处使用autorelease表示你将放弃此控制权但是允许在对象被dealloc之前调用函数使用其返回值。

你也可以使用下面的方法,即不alloc来获取拥有权而是直接返回值也是可以的,例如:

- (NSString *)fullName{

NSString *string = [NSString initWithFormat:@"%@ %@", self.firstName, self.lastName];

return string;

}

但是下面这种方法就是错误的

上面的这种方法,调用函数并不拥有此return的string的值,因此调用函数没有理由去释放返回的string,因此就会造成内存泄漏。所谓的拥有就是说使用alloc new retain等来获得其控制权。

执行dealloc来放弃拥有权

dealloc的调用时机:在对象不再有拥有者并且内存回收时会调用这个方法。dealloc会释放对象的内存并处理其所有的资源包括任何实例对其的所有权

当程序结束后,有可能不会为对象发送dealloc消息。因为进程内存在程序退出后会被自动清除,这样做更为方便。

避免为正在使用的object调用dealloc

使用autorelease pool

Autorelease pool只对于在其作用域内显示使用了autorelease的对象起作用

提供了一种机制,在取消对象时防止立即被销毁。一般不需要创建自己的autorelease pool,但是有一些情况必须或者还是很有必要来创建自己的autorelease pool

在autorelease pool块尾,凡是在块儿内有收到autorelease message的对象都会被发送一个release message

可以嵌套使用

三种情况需要创建自己的autorelease pool

1,基于命令行的程序

2,loop中有过多的临时变量

3,启动子线程

启动线程如果使用posix api而不是NSThread,那么除非cocoa当前项目是多线程否则不能使用cocoa。可以使用ismultithreaded方法来判断是否是多线程

最新文章

  1. PLSQL大数据生成规则
  2. opencv学习笔记(四)投影
  3. POJ 1419 Graph Coloring(最大独立集/补图的最大团)
  4. 转 C编译: 使用gdb调试
  5. OpenERP中的会计凭证
  6. DashClock
  7. tessilstrona
  8. mysql select不使用任何锁(select with nolock)
  9. Nginx的500,502,504错误解决方法
  10. HTML5——JSON的方法实现对象copy
  11. Python小代码_9_求水仙花数
  12. 关于SpringCloud配置网关转发时出现一下啊错误:“com.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.handleException”
  13. ajango--orm操作
  14. python3+正则表达式爬取 猫眼电影
  15. Docker(4):Dockerfile命令一览
  16. [IDEA_4] IDEA 从 GitHub 上 pull 项目到本地
  17. Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度
  18. Mistakes(Updating)
  19. js串结构
  20. Asp.Net MVC Identity 2.2.1 使用技巧(一)

热门文章

  1. CLOUDSTACK FOR HYPER-V
  2. 9.Iptables与Firewalld防火墙
  3. Java 语言概述与开发环境(1)
  4. Leetcode 630.课程表III
  5. LeetCode with Python -> String
  6. java读取文件(更新jdk7及jdk8)
  7. poj 3278 catch that cow BFS(基础水)
  8. Block Nested-Loop 和 Batched Key Access
  9. JavaScript内存分配
  10. vi 使用介绍