OC-NO.7内存

#import <Foundation/Foundation.h>

@class Weapon;

@interface Person : NSObject

{

    Weapon *_weapon;

}

-(void)setWeapon:(Weapon *)wewpon;

-(Weapon *)wewpon;



//在字符串、数组、字典为属性的时候一般都是用copy

//其他的对象都使用retain

@property (nonatomic,copy,readonly) NSString *name;

//基本数据类型使用assign

//assign直接赋值

@property (nonatomic)int age;

@property (nonatomic,assign,getter=isSuccess)BOOL success;

//属性其他关键字

//1、只读:readonly 只允许访问 不允许修改(只允许使用getter方法)

//2、读写:readwrite

//3getter=isSuccess 在取值时候叫做isSuccess

//1retain:只要使用属性  除了基本数据类型 都可以使用retain

//2copy:在使用字符串、数组、字典为属性的时候 可以使用copy

//copy是为了防止赋值的数组被释放 置空,影响属性的数组,所以使用copy,生成一个新的数组

//3assign  是直接赋值 只要是基本数据都是用assign


//设置属性访问权限

//readwrite:开放属性全部权限

//readonly:只开放读取的权限(保护对象里面的数据不被修改)

//ARC

//1strong 强壮的 不会被释调用<告诉系统这个属性是不能释放的>

//2  unsafe_unretained允许在特殊情况下被释放掉 不安全

1 IOS使用APP内存使用不能超过30M,如果超过系统就会发送一个Memory Warning的消息,收到消息后,APP必须正确处理,否则可能出错或者出现内存泄露,甚至崩溃

程序运行时的内存资源是有限的,Objective-C语言所编写的程序中需要实例化对象

对象是要占用内存的,如果创建了对象,(分配了内存)。而不去释放这些对象所占用的内存,将会发生内存泄露

需要手动去管理内存

 管理内存:1、分配内存

         2、释放内存

 在不需要这个对象的时候 及时把这个对象释放掉,就可以防止内存泄露(光分配、不释放)

 

 

 不知道怎么去判断是否需要释放一个对象?

 引用计数:是判断一个对象 是否存在的标准

 得到引用计数公式: 对象名.retainCount

 

 什么养的数据 需要咱们手动管理内存?

 

 基本数据类型(不能称之为对象,因为他只是一个单一的数据) 不用手动管理内存->系统会处理->

 除了基本数据类型 都需要手动管理内存(需要程序员管理)->

 程序员开辟的内存 属于分配到 堆里 egPerson *p = [[Person alloc]init];->需要管理内存

 系统自动分配的内存  会到  栈里  egint a = 10;->不需要管理内存

 

 内存管理的原则:谁分配,谁释放

 

retainCount 引用计数大于0的时候 就是对象存在的时候

 如果不大于0 就表示这个对象 已经被释放了

 

2、生命周期

 1alloc创建之后 对象就存在了

 2)具体对对象的操作

 3)释放对象

3、引用计数

 每个对象是一个整数值

 

 

 引用计数的操作:

 引用计数 是判断一个对象是否存在的标准(>0)

 *************

 让引用计数+1的方法:

 1alloc new

 2retain   保留引用计数

 3copy     拷贝

 

 让引用计数-1的方法:

 1release 释放

 2autorelease  延迟释放

 对象被释放的的时候 会调用一个销毁对象的方法

 delloc->销毁对象

 

*有一个allocretaincopy 就要有一个对应的release 才能释放掉对象

 

 

 setter方法的内存管理

 

 - void dealloc{

    [super delloc];

    [原来的变量(全局变量) release];

 }

 


 - voidset对象名:(类型)参数名{

 if(原来的变量 = 参数名){

     [原来的变量  release];

      原来的变量 = [参数名 retain];

 }

 }

 

 

内存管理的原则:谁分配谁释放

*有一个allocretaincopy 就要有一个对应的releaseautorelease

 dealloc->销毁对象->只要调用了dealloc就标志这个对象被销毁了

 引用计数:retainCount

 引用计数加一:alloc retain copy

 引用计数减一:release autorelease

 

 copy 会产生一个新的对象 新的对象引用计数+1

 retain 保留引用计数 给(原来)对象引用计数+1  只要有一个引用计数为0 这个对象就会被销毁(操作的是同一个对象)

 copy 会产生一个新的对象 给新的对象引用计数+1(跟原来对象没有关系)——>如果释放了原来的对象 新的对象依然存在

 

 autorelease:延迟释放  等到需要释放的时候才会去释放 也会引用计数-1

 autorelease常与自动释放池配合使用

 自动释放池:在自动释放池里面的对象,只要使用了autorelease在出池的时候 就会被统一释放掉

          自动释放池有两种写法

 1@autoreleasepool {

 花括号内表示 自动释放池内

 }出了花括号就表示出池(所有使用autorelease的对象全部会被释放掉)


 2 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

 只要在自动释放池对象release之前都算池内

 [pool release];所有使用autorelease的对象全部会被释放掉

 

 属性的ARC关键字的声明

 

 属性手动管理引用计数:

 

 MRC: 手动管理引用计数

 

 ARC: 自动管理引用计数

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值