您的位置:首页 > 其它

内存管理

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: