内存管理
2015-10-10 13:29
218 查看
一、引用计数
如果内存管理不当
1、不再使用对象没有被回收,内存泄露,最终导致程序闪退
2、正在被使用对象被释放了,野指针,访问野指针就会导致程序崩溃
ARC Automatic Reference Counting 自动引用计数
MRC Manual Reference Counting 手动引用计数
1、当一个对象刚刚出生时候,它的引用计数 1
2、当对象上引用计数是0的时候,系统立即把它回收
3、release 引用计数-1
4、retain 引用计数+1
二、各种关键字(@pr)
如果内存管理不当
1、不再使用对象没有被回收,内存泄露,最终导致程序闪退
2、正在被使用对象被释放了,野指针,访问野指针就会导致程序崩溃
ARC Automatic Reference Counting 自动引用计数
MRC Manual Reference Counting 手动引用计数
1、当一个对象刚刚出生时候,它的引用计数 1
2、当对象上引用计数是0的时候,系统立即把它回收
3、release 引用计数-1
4、retain 引用计数+1
int main(int argc, const char * argv[]) { CZPerson *person = [[CZPerson alloc] init];//1 long count = [person retainCount]; NSLog(@"%zd",count); [person retain];//2 NSLog(@"%zd",[person retainCount]); [person release];// 0 NSLog(@"%zd",[person retainCount]); [person release]; // person = nil; // 当一个指针指向 nil,这个指针我称为空指针 // 给空指针发送消息系统不会报错,它什么都不做 [person test]; [person dealloc]; NSLog(@"%zd",[person retainCount]);// return 0; }
#import <Foundation/Foundation.h> @interface CZPerson : NSObject - (void) test; @end
#import "CZPerson.h" @implementation CZPerson - (void) test { NSLog(@"CZPerson"); } //永远不要试图自己调用这个方法 -(void) dealloc { // 这里可以验证对象是否被回收了 NSLog(@"CZPerson 回收"); // 这个方法中必须调用父类该方法,并且必须放在最后 [super dealloc]; } @end
二、各种关键字(@pr)
#import <Foundation/Foundation.h> #import "CZRoom.h" /* 手动内存管理的关键字 retain 就再setter 和 getter方法中加入一些内存管理的代码 当属性是一个普通OC对象的时候,使用retain 自动内存管理的关键字 strong 用于普通OC对象 weak 循环引用,一端必须用weak assign 直接赋值,不生成内存管理代码 当属性是一个基本数据类型的时候,使用assign copy 复制对象,NSString 使用copy 线程安全 nonatomic:非原子,不会生成线程安全的代码,速度快,iOS通常都是这种 atomic:原子(默认),会生成线程安全的代码,速度慢 控制权限 readwrite:可读可写,生成getter 与 setter方法是声明与实现 readonly:只读 只生成getter方法 修改方法名称 getter 修改生成的getter方法的名称 一般情况下,BOOL类型的属性的getter方法是以is开头的 setter 修改生成的setter方法的名称 一般不去修改它 */ @interface CZPerson : NSObject @property (nonatomic,assign,getter=isMan) BOOL man; @property (nonatomic,copy) NSString *name; @property (nonatomic,assign,readonly) int age; @property (nonatomic,retain) CZRoom * room; @end
#import <Foundation/Foundation.h> #import "CZPerson.h" int main(int argc, const char * argv[]) { CZPerson *p = [[CZPerson alloc] init]; [p setMyMan:YES]; BOOL isMan = p.isMan; return 0; }
相关文章推荐
- 让人不寒而栗的中小企业真相
- ios随机数,and()、random()、arc4random()
- Android MediaPlayer与Http Proxy结合之优化篇
- 编译时错误之 error C2338: tuple_element index out of bounds
- Java泛型的基本使用
- 最近影讯api数据库整合分享
- Bitmap,byte[],Drawable相互转化
- 前景检测
- C++学习:模板类学习
- 玩转 Android MediaPlayer之视频预加载
- Android - Application 类简介及应用程序的生命周期事件
- IE下的deflate模式
- IE下的deflate模式
- IE下的deflate模式
- MySql绿色版配置及使用详解
- opencv帮助
- 玩转 Android MediaPlayer之视频预加载
- ffmpeg 滤镜及其效果
- linux的一些常用命令
- Tomcat源码分析——server.xml文件的加载