//
// main.m
/*
autorelease也是用于内存管理的,给对象发送autorelease消息就会把对象放入autoreleasepool这个池子中,当池子销毁的时候会对池子里面的所有对象发送一条release消息,只是计数器减一,不一定会销毁。
1.autorelease方法会返回对象本身,好比init方法,
Person *p = [Person new];
p = [p autorelease];
2.调用autorelease方法不会对对象的引用计数器加1。
3.不需要写release方法。
*/ #import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) { //需要把项目了 变成手动内存管理MRC
@autoreleasepool {
Person *p3 =[[Person alloc] init];
[p3 run]; // 时时刻刻都关注对象什么时候被释放
[p3 release];
p3 = nil; // 给野指针发送消息
[p3 run];
} Person *p4 = nil;
@autoreleasepool { // 创建一个自动释放池
p4 = [[Person alloc] init]; // 1
// 不用关心对象什么时候释放, 只要能够访问p的地方都可以使用p
p4 = [p4 autorelease]; // 只要调用了autorelease,将对象p放入自动释放池中,当自动释放池释放的时候,会池里面的所有对象发送一条release消息。
NSLog(@"%lu",[p4 retainCount]); // p4 = [p4 autorelease];
p4 = [p4 autorelease];
p4 = [p4 autorelease];
p4 = [p4 autorelease];
p4 = [p4 autorelease];
NSLog(@"%lu",[p4 retainCount]); //
[p4 retain]; // [p4 run];
} // 自动释放池销毁了, 给自动释放池中所有的对象发送一条release消息
NSLog(@"%lu",[p4 retainCount]);
[p4 retain];
NSLog(@"%lu",[p4 retainCount]);
[p4 run]; // autorelease其它写法
@autoreleasepool {
// Person *p = [[Person alloc] init];
// p = [p autorelease];
Person *p = [[[Person alloc] init] autorelease];
[p run];
} // ios5以前的写法:创建一个自动释放池
// 自动释放池只是将release延迟了而已 NSAutoreleasePool *pool5 = [[NSAutoreleasePool alloc] init]; Person *p5 = [[[Person alloc] init] autorelease];
[p5 run]; // 销毁一个自动释放池
[pool5 release]; return ;
}
//  Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject

    - (void)run;

@end
//  Person.m

#import "Person.h"

@implementation Person

    - (void)run
{
NSLog(@"%s", __func__);
} - (void)dealloc
{
NSLog(@"%s", __func__);
[super dealloc];
} @end

oc52--autorelease1的更多相关文章

  1. 读oc52个有效方法的总结

    这本书主要是对于oc语言的代码优化和一些我们不知道的精华.全书分为7章节 1.熟悉oc语言 第一条:了解oc的语言起源 主要是对于oc语言的起源介绍和oc语言的特点进行概括,oc语言主要是使用消息结构 ...

  2. jquery点击label触发2次的问题

    今天写问卷的时候遇到个label点击的时候,监听的click事件被执行两次:产生这个的原因么...事件冒泡 <div class="questionBox checkBox" ...

随机推荐

  1. Jquery 多行拖拽图片排序 jq优化

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. 报错:command not found

    linux中如果是最小化安装的系统,执行命令的时候很多会出现没找到命令 [root@localhost ~]# mtr -bash: mtr: command not found [root@loca ...

  3. 国密SSL证书免费试用申请指南

    沃通提供国密SSL证书免费申请试用服务,一次申请可同时签发SM2/RSA双算法证书,试用周期1个月,用于测试国密SM2 SSL证书的运行效果和SM2/RSA双证书部署效果. 试用产品:SM2/RSA双 ...

  4. adjtimex修改tick值用法举例

    测试 用户态下内核时钟计数间隔,默认都是100HZ.因此单个tick代表了10^4 us. 可以设置每个tick代表的时钟长度,因此把tick增加1(即增加为10001us)的影响是每天时间快8.64 ...

  5. [测试工具]----iperf

    iperf https://sourceforge.net/projects/iperf/ http://downloads.es.net/pub/iperf/ https://github.com/ ...

  6. 如何反向遍历List集合

    List接口中提供了ListIterator<E> listIterator()这样的一个方法,可以获得一个ListIterator接口的实例,如下: 看一下他的方法: 了解了这些之后再看 ...

  7. JavaScript单元测试工具-Jest

    标注: 首先这并不是一篇完整的关于Jest的教程,只是个人在接触jest学习的一点随手笔记,大部分内容都是对官方文档的一些翻译. ----------------------------------- ...

  8. 垂直相邻margin合并解决方法

    块级元素的垂直相邻外边距会合并,水平边距永远不会重合. 行内元素实际上不占上下外边距,左右外边距也不会合并.浮动元素的外边距也不会合并. 外边距重叠的意义 外边距的重叠只产生在普通流文档的上下外边距之 ...

  9. ubuntu 14.04 gcc/g++版本降低

    Matlab 2014a支持的gcc/g++版本是4.7x,而ubuntu 14.04以及更高版本默认安装的版本都是4.8及以上,因此需要降低gcc/g++版本,方法如下: 1 安装 $ sudo a ...

  10. 洛谷 P1469 找筷子

    题目描述 经过一段时间的紧张筹备,电脑小组的“RP餐厅”终于开业了,这天,经理LXC接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘手的问题,筷子!CX ...