OC MRC之autorelease问题(代码分析)
//
// main.m
// 08-autorelease
//
// Created by apple on 13-8-9.
// Copyright (c) 2013年 itcast. All rights reserved.
// /*
1.autorelease的基本用法
1> 会将对象放到一个自动释放池中
2> 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3> 会返回对象本身
4> 调用完autorelease方法后,对象的计数器不变 2.autorelease的好处
1> 不用再关心对象释放的时间
2> 不用再关心什么时候调用release 3.autorelease的使用注意
1> 占用内存较大的对象不要随便使用autorelease
2> 占用内存较小的对象使用autorelease,没有太大影响 4.错误写法
1> alloc之后调用了autorelease,又调用release
@autoreleasepool
{
// 1
Person *p = [[[Person alloc] init] autorelease]; // 0
[p release];
} 2> 连续调用多次autorelease
@autoreleasepool
{
Person *p = [[[[Person alloc] init] autorelease] autorelease];
} 5.自动释放池
1> 在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
2> 当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池 6.自动释放池的创建方式
1> iOS 5.0前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [pool release]; // [pool drain]; 2> iOS 5.0 开始
@autoreleasepool
{ }
*/ #import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, assign) int age; @end #import "Person.h" @implementation Person
- (void)dealloc
{
NSLog(@"Person---dealloc"); [super dealloc];
}
@end #import <Foundation/Foundation.h>
#import "Person.h" int main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Person *pp = [[[Person alloc] init] autorelease]; [pool release]; // [pool drain]; @autoreleasepool
{ //
Person *p = [[[[Person alloc] init] autorelease] autorelease]; // 0
// [p release];
} return ;
} void test()
{
@autoreleasepool
{// { 开始代表创建了释放池 // autorelease方法会返回对象本身
// 调用完autorelease方法后,对象的计数器不变
// autorelease会将对象放到一个自动释放池中
// 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
Person *p = [[[Person alloc] init] autorelease]; p.age = ; @autoreleasepool
{
//
Person *p2 = [[[Person alloc] init] autorelease];
p2.age = ; } Person *p3 = [[[Person alloc] init] autorelease]; } // } 结束代表销毁释放池
}
第二部分
//
// main.m
// 09-autoreleased的应用
//
// Created by apple on 13-8-9.
// Copyright (c) 2013年 itcast. All rights reserved.
//
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, assign) int age; + (id)person; + (id)personWithAge:(int)age;
@end #import "Person.h" @implementation Person + (id)person
{
return [[[self alloc] init] autorelease];
} + (id)personWithAge:(int)age
{
Person *p = [self person];
p.age = age;
return p;
} - (void)dealloc
{
NSLog(@"%d岁的人被销毁了", _age); [super dealloc];
}
@end #import "Person.h" @interface GoodPerson : Person @property (nonatomic, assign) int money; @end
#import "GoodPerson.h" @implementation GoodPerson @end #import <Foundation/Foundation.h>
#import "Person.h"
#import "GoodPerson.h" /*
1.系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的 2.开发中经常会提供一些类方法,快速创建一个已经autorelease过的对象
1> 创建对象时不要直接用类名,一般用self
+ (id)person
{
return [[[self alloc] init] autorelease];
}
*/ int main()
{
@autoreleasepool {
Person *p = [Person personWithAge:]; GoodPerson *p2 = [GoodPerson personWithAge:]; p2.money = ;
}
return ;
} void test()
{
Person *p = [[Person alloc] init]; p.age = ; [p release]; // 包
// Student com.mj.test
// Student com.mj.test2 // MJStudent // SBStudent // Next Step @autoreleasepool
{
// Person *p2 = [Person person];
//
// p2.age = 100; Person *p2 = [Person personWithAge:]; // Person *p2 = [[[Person alloc] init] autorelease];
//
// p2.age = 300; NSString *str = @""; NSString *str2 = [NSString stringWithFormat:@"age is %d", ]; NSNumber *num = [[NSNumber alloc] initWithInt:];
[num release]; NSNumber *num2 = [NSNumber numberWithInt:];
}
}
OC MRC之autorelease问题(代码分析)的更多相关文章
- Linux内核启动代码分析二之开发板相关驱动程序加载分析
Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c start_ke ...
- Android代码分析工具lint学习
1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...
- pmd静态代码分析
在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...
- [Asp.net 5] DependencyInjection项目代码分析-目录
微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)
Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...
- 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)
构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...
- STM32启动代码分析 IAR 比较好
stm32启动代码分析 (2012-06-12 09:43:31) 转载▼ 最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...
- 常用 Java 静态代码分析工具的分析与比较
常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...
- SonarQube-5.6.3 代码分析平台搭建使用
python代码分析 官网主页: http://docs.sonarqube.org/display/PLUG/Python+Plugin Windows下安装使用: 快速使用: 1.下载jdk ht ...
随机推荐
- ELK学习笔记之Logstash详解
0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...
- 20145322 Exp5 利用nmap扫描
20145322 Exp5 利用nmap扫描 实验过程 使用命令创建一个msf所需的数据库 service postgresql start msfdb start 使用命令msfconsole开启m ...
- linux下kermit工具的使用
1.环境: ubuntu16.04 2.背景: 想更换下位机内核 3.使用kermit进行串口传输 举例:传输文件到下位机 2.1首先进入下位机的uboot 2.2 使用uboot自带的命令从串口接收 ...
- Unity 之 Vector3
class Variables one 指向(0,0,0) zero 指向(1,1,1) right指向 x轴的方向 Up 指向 y轴的方向 forward 指向 z轴的方向
- 从零开始的四轴飞行器-开篇flag
在这里立下flag,我要理解学会四轴飞行器的控制方法.
- U盘中病毒了怎么办
声明: 该方案仅是我处理自己U盘的心得,如果您看到这篇文件,并使用此方法,有任何数据丢失或者损失,我概不负责 问题: U盘里面显示占用了空间,就是看不到文件,或者仅有一两个自己不认识的文件 处理方案: ...
- axios post请求报错
问题描述: vue中使用axios提交post请求, 请求地址及参数都对, 但是一直报缺少参数的错误 探索:对比post请求数据, 提交数据的方式不对 (1)axios的post请求(返回响应缺少参数 ...
- python 散列表查找
class HashTable: def __init__(self, size): self.elem = [None for i in range(size)] self.count = size ...
- MAC OS 英语朗读功能
哈哈哈,太神奇了 在命令行中敲say + word ,系统能够自己讲word读出来. 如果是敲的是 say +中文, 就不知道再读什么啦 哈哈哈哈---- 此外,在对应网站选中内容后还可以右击,用sp ...
- 解决在nginx+php环境下$_SERVER['PHP_SELF']获取不到值的问题
Tp3.2. __APP__获取值不正确.$_SERVER['PHP_SELF']为空导致. 原来是php.ini的问题. sudo vim /usr/local/php/etc/php.ini 重启 ...