手动内存管理基本概念
与内存管理相关的6个关键字:retain release dealloc set @property ,autorelease
内存管理要注意:
一个原则:配对原则
两个基本问题://1.野指针操作
//2.内存泄漏
// #import @interface Person : NSObject - (void)run; @end // #import "Person.h" @implementation Person -(void)dealloc { } - (void)run { } @end // #import #import "Person.h" int main(int argc, const char * argv[]) { } |
单个对象的内存管理分析
// #import @interface Person : NSObject @property int age; - (void)run; @end // #import "Person.h" @implementation Person - (void)dealloc { } - (NSString *)description { } - (void)run { } @end // //内存管理原则(配对原则):只要出现了 new,alloc,retain,就一定配对出现一个release,autorelease //手动内存管理研究问题方法 //1.野指针操作 //2.内存泄漏 #import #import "Person.h" void test() { } void test2() { } void test3() { } void test4() { } void test5(Person * p) { // } int main(int argc, const char * argv[]) { // } |
多个对象的内存管理分析(写法上不完美仅做例子)
// #import @interface Car : NSObject - (void)run; @end // #import "Car.h" @implementation Car - (void)dealloc { } - (void)run { } @end // #import #import "Car.h" @interface Person : NSObject { } - (void)setCar:(Car *)car; - (Car *)car; - (void)drive; @end // #import "Person.h" @implementation Person - (void)setCar:(Car *)car { } - (Car *)car { } - (void)drive { } - (void)dealloc { } @end // #import //人拥有一辆汽车 #import "Person.h" //1.野指针问题 //2.内存泄漏问题 int main(int argc, const char * argv[]) { } |
set方法的内存管理分析(重点、难点)
// #import @interface Car : NSObject @property int speed; - (void)run; @end // #import "Car.h" @implementation Car - (void)dealloc { } - (void)run { } @end // #import #import "Car.h" @interface Person : NSObject { } - (void)setName:(NSString *)name; - (NSString *)name; - (void)setCar:(Car *)car; - (Car *)car; - (void)drive; @end // #import "Person.h" //配对原则:new alloc retain 对应一个release,autorelease @implementation Person - (void)setName:(NSString *)name { } - (NSString *)name { } //面试笔试,出题率非常高 - (void)setCar:(Car *)car { } - (Car *)car { } - (void)drive { } - (void)dealloc { } @end // #import #import "Person.h" int main(int argc, const char * argv[]) { } |
@property参数
// #import #import "Car.h" @interface Person : NSObject //1.生产get与set方法的声明 //2.生成get与set方法的简单实现 //3.若果你没有声成名相对象的成员变量,那么他会自动生成一个_开头的成员变量 //@property 参数分为4类 //2.多线程相关 //nonatomic: 不生成多线程线管代码,使用这个就可以了(效率高一点) //atomic:生成多线程线管代码(不写默认是这种方式) //实际开发中,只要是对象类型的@property都写成下面 @property (nonatomic,retain) Car * car; //3.是否要生成set与get方法 //readwrite: 可读可写属性,同时生成set与get方法 //readonly : 只读属性,只生成get方法 //4.set与get方法名称相关的参数 //setter:设置生成的set方法名称 //getter:设置生成的get方法名称 @property (nonatomic,retain) Car * car; @property (nonatomic,retain)NSString * name; @property (nonatomic,assign)int age; //int float double char @property (nonatomic,assign)int weight; @property (nonatomic,assign,readonly)int idCard; @property (nonatomic,assign,setter = abc:,getter = zhuanghuimei)int height; //改变set与get方法名称很多都是用在BOOL类型的变量 @property (nonatomic,assign,setter = isDeid:,getter = isDeid)BOOL isDeid; //- (void)isDeid:(BOOL)isDeid; //- (void)setHeight:(int)height; //- (int)height; @end // #import "Person.h" @implementation Person - (void)dealloc { } @end // #import @interface Car : NSObject @end // #import "Car.h" @implementation Car -(void)dealloc { } @end // #import #import "Person.h" int main(int argc, const char * argv[]) { } |
autorelease基本概念
// #import @interface Person : NSObject @end // #import "Person.h" @implementation Person - (void)dealloc { } @end // //内存管理原则(配对原则):只要出现了new,alloc,retain方法,就要配对出现release,autorelease //对象存入到自动释放池中,当这个池子被销毁的时候他会对池子中所有的对象进行一次release操作 //怎么把对象存到池子中 #import #import "Person.h" int main(int argc, const char * argv[]) { } |
autorelease应用(最重要的应用)
// #import @interface Food : NSObject @property(nonatomic,retain) NSString * name; @end // #import "Food.h" @implementation Food - (void)dealloc { } @end // #import #import "Food.h" @interface Chief : NSObject + (Chief *)chief; - (Food *)chiefMakeFood; @end // #import "Chief.h" @implementation Chief - (void)dealloc { } + (Chief *)chief { } - (Food *)chiefMakeFood { // // } @end // #import #import "Chief.h" //autorelease笔试面试出现的几率比[release] int main(int argc, const char * argv[]) { } |