oc53--autorelease注意事项
//
// main.m
// autorelease注意事项 #import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) { Person *p1 = [[Person alloc] init];
@autoreleasepool {
Person *p2 = [[[Person alloc] init] autorelease];
[p2 run]; // 2.在自动释放池中创建了对象, 一定要调用autorelease,才会将对象放入自动释放池中
Person *p3 = [[Person alloc] init];
[p3 run]; // 3.只要在自动释放池中调用autorelease, 就会将对象放入自动释放池,即使p1在外面定义的。
p1 = [p1 autorelease];
[p1 run];
}
// 1.一定要在自动释放池中调用autorelease, 才会将对象放入自动释放池中
Person *p4 = [[[Person alloc] init] autorelease]; // 4.一个程序中可以创建N个自动释放池, 并且自动释放池还可以嵌套
// 如果存在多个自动释放池的时候, 自动释放池是以 "栈" 的形式存储的
// 栈的特点: 先进后出 // 给一个对象方法发送一条autorelease消息, 永远会将对象放到栈顶的自动释放池
@autoreleasepool { // 创建第一个释放池
@autoreleasepool { // 创建第二个释放池
@autoreleasepool { // 创建第三个释放池
Person *p = [[[Person alloc] init] autorelease];//放在第三个自动释放池里面,因为第三个释放池在最上面。
[p run];
} // 第三个释放池销毁,会将p释放。 Person *p1 = [[[Person alloc] init] autorelease];//放在第二个释放池里面,因为第二个池子在最上面, }// 第二个释放池销毁,此时p1会销毁
}// 第一个释放池销毁 @autoreleasepool {
// 千万不要写多次autorelease,一个alloc, new对应一个autorelease
Person *p1 = [[[[Person alloc] init] autorelease] autorelease];//当池子销毁的时候会发送2次release消息,过度释放。 // 如果写了autorelease就不要写release
// 总之记住: 一个alloc/new对应一个autorelease或者release
Person *p = [[[Person alloc] init] autorelease];
[p release];
} return ;
}
//
// ViewController.m
// 自动释放池大对象问题
//
// Created by xiaomage on 15/6/26.
// Copyright (c) 2015年 xiaomage. All rights reserved.
// #import "ViewController.h"
#import "Person.h" @interface ViewController () @end @implementation ViewController - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
/*
// 1.不要再自动释放池中使用比较消耗内存的对象, 占用内存比较大的对象
@autoreleasepool {
Person *p = [[[Person alloc] init] autorelease]; // 假如p对象只在100行的地方使用, 以后都不用了 // 一万行代码,p对象需要在一万行时候释放,p一直占用着内存。
}
*/ // 2.尽量不要再自动释放池中使用循环, 特别是循环的次数非常多, 并且还非常占用内存
@autoreleasepool {
for (int i = ; i < ; ++i) {
// 每调用一次都会创建一个新的对象
// 每个对象都会占用一块存储空间
Person *p = [[[Person alloc] init] autorelease];
}
} // 只有执行到这一行, 所有的对象才会被释放 /*
for (int i = 0; i < 99999; ++i) {
@autoreleasepool {
Person *p = [[[Person alloc] init] autorelease];
} // 执行到这一行, 自动释放池就释放了
}
*/
NSLog(@"--------");
} @end
oc53--autorelease注意事项的更多相关文章
- autorelease注意事项
1.autorelease使用注意 并不是放到自动释放池代码中,都会自动加入到自动释放池 @autoreleasepool { // 因为没有调用 autorelease 方法,所以对象没有加入到自动 ...
- OC基础(16)
autorelease基本使用 autorelease注意事项 *:first-child { margin-top: 0 !important; } body > *:last-child { ...
- OC基础笔记目录
OC基础(1) Objective-C简介 OC和C对比 第一个OC程序 面向对象思想 OC基础(2) 类与对象 类的设计 第一个OC类 对象方法的声明和实现 类方法的声明和实现 OC基础(3) 对象 ...
- OC-ARC,类扩展,block
总结 标号 主题 内容 一 autorelease autorelease基本概念/自动释放池/autorelease基本使用 二 autorelease注意事项 注意点/应用场景 三 ARC 什么是 ...
- PhoneGap在iOS开发下的注意事项
敏捷个人应用主要是在Andorid下开发,发布的也主要是Andorid.之所以没有急着退出iOS版本,主要是因为开发iOS需要iOS的开发环境,发布还需要开发者账号,这些都需要资源或钱.而最近越来越多 ...
- Objective-C 【autorelease基本使用】
------------------------------------------- NSString中的内存管理问题 由于autoreleasepool的存在,对于内存管理就会很复杂,retain ...
- objective-C 的内存管理之-自动释放池(autorelease pool)
如果一个对象的生命周期显而易见,很容易就知道什么时候该new一个对象,什么时候不再需要使用,这种情况下,直接用手动的retain和release来判定其生死足矣.但是有些时候,想知道某个对象在什么时候 ...
- 用xib自定义UITableViewCell的注意事项——重用
问题的提出: 有时候我们经常需要自定义tableView的cell,当cell里面的布局较为复杂时往往舍弃纯代码的方式而改用xib的方式进行自定义.当我们用纯代码的方式布局cell时,往往会在cell ...
- iPhone SDK中多线程的使用方法以及注意事项
多线程iphonethreadapplication编程嵌入式 然现在大部分PC应用程序都支持多线程/多任务的开发方式,但是在iPhone上,Apple并不推荐使用多线程的编程方式.但是多线程编程毕竟 ...
随机推荐
- JavaWeb项目中引入spring框架
主要步骤有以下3步: 1:下载spring的jar包2:在项目中web.xml中添加spring配置3:bean配置文件-applicationContext.xml 1:引入包,这个就不说了,官网下 ...
- [Windows Server 2012] PHPWind安全设置
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★[护卫神·V课堂]是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:PHPWin ...
- 【技术累积】【点】【java】【27】@JSONField
@JSONField 该注解隶属于阿里fastjson,方便fastjson处理对象时的一些操作 源码 @Retention(RetentionPolicy.RUNTIME) @Target({ El ...
- ABP生成错误:必须添加对程序集“netstandard”的引用
当前使用ABP版本为:4.6.0 升级vs2017到15.4版本,升级framework到4.7版本 如果Core版本请升级到net core 2
- string.format("%s",name)
TCHAR name[40]; acedGetString(0, _T("输入名字"), name); acutPrintf(name); CString na; na.Forma ...
- ngFor 循环带索引
*ngFor="let item of userList,let i = index" 或者 *ngFor="let item of userList index a ...
- 【转载】文件上传Expected MultipartHttpServletRequest: is a MultipartResolver错误解决
引入包commons-fileupload-*.jar,版本号可以根据项目情况调整: 在spring mvc配置文件中增加配置,文件大小限制可根据项目情况调整: <!-- 上传文件拦截,设置最大 ...
- MVCHelper 请求检验
public class MVCHelper { //有 两 个ModelStateDictionary类,别弄混乱了要使用 System.Web.Mvc 下的 //如果添加引用中找不到System. ...
- C# DataTable扩展方法
在日常搬砖中,总结了一些简单的扩展方法. public static bool IsNullOrEmpty(this DataTable dt) { ; } public static bool Is ...
- HDU-5968异或密码
超级传送门 题目描述: 晨晨在纸上写了一个长度为N的非负整数序列{ai}.对于这个序列的一个连续子序列{al,al+1,…,ar}晨晨可以求出其中所有数异或的结果 alxoral+1xor...xor ...