内存管理(一)
来源:互联网 发布:侠客风云传官网优化 编辑:程序博客网 时间:2024/05/15 04:34
//// main.m// 8_11_oc内存管理//// Created by lanou3g on 15/8/11.// Copyright (c) 2015年 lanou3g. All rights reserved.//#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { //将整型数10 保存在变量a中。 int a = 10; //下面这句话,先执行右边的,现在堆内存中开辟一段存储空间,存储创建好的Person对象,对象的空间地址储存在p1中。 //p1指向创建的Person对象 //通常:将指向某个对象的指针,代指为对象 Person *p1 = [[Person alloc]init]; Person *p2 = p1; //p3就是指针,没有指向任何对象。,nil相当于null,只能给指针赋值。 //在oc中,对nil做任何操作,都相当于空操作,但不会崩溃 //在C语言中操作空指针,会会崩溃。 Person *p3 = nil; p3.name = @"hahha"; NSLog(@"%@",p3.name); Person *p4 = [[Person alloc]init]; Person *p5 = [[Person alloc]init]; NSArray *arr = [NSArray arrayWithObjects:p1,p2,p4,p5, nil]; //从数组中取出第二个元素 Person *p = arr[2]; NSLog(@"%@ %@",p,p4);#pragma mark-------------内存管理 //mac支持gc(垃圾回收),iphone不支持gc。语言是支持垃圾回收的。 //内存管理机制,引用计数 //多个指针可以指向同一个对象 //为了避免出现野指针,需要使用对象时要计数,不使用对象时,要对计数减一。 //alloc Person *p6 = [[Person alloc]init]; NSLog(@"%lu",[p6 retainCount]); //retain, 引用计数加一,不关心原始数据; [p6 retain]; NSLog(@"%lu",[p6 retainCount]); //此时p7指向p6,引用计数没有变化 Person *p7 = p6; NSLog(@"%lu",[p7 retainCount]); //p6指向的Person对象,引用计数加1,p8指向了p7,p6指向的对象 Person *p8 = [p6 retain]; NSLog(@"%lu",[p8 retainCount]); //调用release,实现引用计数减1 [p7 release]; NSLog(@"%lu",[p8 retainCount]); [p8 release]; NSLog(@"%lu",[p8 retainCount]); //当你的引用计数应该减为0时,对象自动销毁,存储空间被回收。 //但是打印永远为1; 因为内部有一个判断, [p8 release]; NSLog(@"%lu",[p8 retainCount]); //应该为0,但打印为0; //现在就不能再使用创建的对象,因为已经被销毁了。 //retainCount 的作用,观察引用计数的变化.增加减少的变化。只看变化,不看结果。 Person *pe1 = [[Person alloc]init]; [pe1 retain]; //2 [pe1 autorelease]; // [NSThread sleepForTimeInterval:3]; NSLog(@"%lu",[pe1 retainCount]);/* //release的内部实现应该如下 -(void)release { if(self.retainCount>1) { self.retainCount--; } if(self.retainCount==1) { [self dealloc]; retainCount = 1; } } */ /* 1、内存管理原因: (1)内存溢出 内存不够用 (2)野指针异常 指针操作了不属于自己的存储空间,指针操作已经销毁的对象 2、内存管理的方式 (1)垃圾回收 OC支持,mac开发支持,iOS开发不支持 (2)mrc iOS开发 手动操作引用计数,手动调用控制引用计数的方法 (3)arc iOS开发 自动操作引用计数,编译器调用引用计数的方法 3、内存管理的机制 (1)引用计数 标记程序运行期间,对象被引用的次数 (2)通过操作引用计数,控制对象是否被销毁。 (3)当引用计数应该减为0时,对象自动被销毁,存储空间被回收 4、操作引用计数的方法 (1)造成引用计数增加 alloc 当前对象 0 -> 1 retain 当前对象 加1 copy 原来的对象 不变 新的对象 0 -> 1 (2)造成引用计数减少 release 当前对象 立即减1 autorelease 当前对象 延迟减1 非立即 5、销毁对象 dealloc 引用计数将要减为0时,对象自动调用 (1)继承自NSObject,可以不实现,编译器默认实现 (2)如果实现dealloc方法 - (void)dealloc { 代码 [super dealloc]; } */ } return 0;}
0 0
- 内存管理(一)
- 内存管理(一)
- 内存管理(一)
- 内存管理(一)
- 内存管理(一)
- Memcached 内存管理(一)
- C++内存管理(一)
- Linux内存管理(一)
- 内存管理一(概述)
- C++内存管理(一)
- 内存分配管理(一)
- AMPS:内存管理(一)
- iOS 内存管理(一)
- C++内存管理(一)
- iOS:内存管理(一)
- OC内存管理(一)
- Memcached 内存管理(一)
- 操作系统 内存管理(一)
- SQL多表update
- jdk自带的jvm监控工具
- 26-网络编程-01-网络编程(网络模型概述)
- 返回上一层activity
- cell自适应高度
- 内存管理(一)
- 如何通过MyEclipse生成含有第三方包的jar包
- 函数在线模拟
- SSH基本应用命令
- 块设备驱动学习过程
- 上市公司行情查询网站
- Android SERVICE后台服务进程的守护
- 利用Navicat传输MySql中不同数据库的数据
- log4j日志、反射、枚举、克隆