一、引用计数
如果内存管理不当
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;
}