#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
//3、getter=isSuccess 在取值时候叫做isSuccess
//1、retain:只要使用属性 除了基本数据类型 都可以使用retain
//2、copy:在使用字符串、数组、字典为属性的时候 可以使用copy
//copy是为了防止赋值的数组被释放 置空,影响属性的数组,所以使用copy,生成一个新的数组
//3、assign 是直接赋值 只要是基本数据都是用assign
//设置属性访问权限
//readwrite:开放属性全部权限
//readonly:只开放读取的权限(保护对象里面的数据不被修改)
//ARC
//1、strong 强壮的 不会被释调用<告诉系统这个属性是不能释放的>
//2、 unsafe_unretained允许在特殊情况下被释放掉 不安全
1、 IOS使用APP内存使用不能超过30M,如果超过系统就会发送一个Memory Warning的消息,收到消息后,APP必须正确处理,否则可能出错或者出现内存泄露,甚至崩溃
程序运行时的内存资源是有限的,Objective-C语言所编写的程序中需要实例化对象
对象是要占用内存的,如果创建了对象,(分配了内存)。而不去释放这些对象所占用的内存,将会发生内存泄露
需要手动去管理内存
管理内存:1、分配内存
2、释放内存
在不需要这个对象的时候 及时把这个对象释放掉,就可以防止内存泄露(光分配、不释放)
不知道怎么去判断是否需要释放一个对象?
引用计数:是判断一个对象 是否存在的标准
得到引用计数公式: 对象名.retainCount
什么养的数据 需要咱们手动管理内存?
基本数据类型(不能称之为对象,因为他只是一个单一的数据) 不用手动管理内存->系统会处理->栈
除了基本数据类型 都需要手动管理内存(需要程序员管理)->堆
程序员开辟的内存 属于分配到 堆里 eg:Person *p = [[Person alloc]init];堆->需要管理内存
系统自动分配的内存 会到 栈里 eg:int a = 10;栈->不需要管理内存
内存管理的原则:谁分配,谁释放
retainCount 引用计数大于0的时候 就是对象存在的时候
如果不大于0 就表示这个对象 已经被释放了
2、生命周期
(1)alloc创建之后 对象就存在了
(2)具体对对象的操作
(3)释放对象
3、引用计数
每个对象是一个整数值
引用计数的操作:
引用计数 是判断一个对象是否存在的标准(>0)
*************
让引用计数+1的方法:
(1)alloc new
(2)retain 保留引用计数
(3)copy 拷贝
让引用计数-1的方法:
(1)release 释放
(2)autorelease 延迟释放
对象被释放的的时候 会调用一个销毁对象的方法
delloc->销毁对象
*有一个alloc、retain、copy 就要有一个对应的release 才能释放掉对象
setter方法的内存管理
- (void) dealloc{
[super delloc];
[原来的变量(全局变量) release];
}
- (void)set对象名:(类型)参数名{
if(原来的变量 != 参数名){
[原来的变量 release];
原来的变量 = [参数名 retain];
}
}
内存管理的原则:谁分配谁释放
*有一个alloc、retain、copy 就要有一个对应的release、autorelease
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: 自动管理引用计数