博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中的内存管理1
阅读量:4562 次
发布时间:2019-06-08

本文共 3467 字,大约阅读时间需要 11 分钟。

#import 
#import "Person.h"int main(int argc, const char * argv[]) {// @autoreleasepool {// // Person *p = [[Person alloc] initWithName:@"池" gender:@"nan" age:18];// NSLog(@"%lu",[p retainCount]);// // // NSLog(@"--------------");// Person *p1 = [p retain];// NSLog(@"%lu",[p retainCount]);// NSLog(@"%lu",[p1 retainCount]);// // NSLog(@"--------------");// // Person *p2 = [p1 retain];// NSLog(@"%lu",[p retainCount]);// NSLog(@"%lu",[p1 retainCount]);// NSLog(@"%lu",[p2 retainCount]);// // NSLog(@"--------------");// //release 让对象的引用计数立即 -1// [p release];// NSLog(@"%lu", [p retainCount]);// [p release];// NSLog(@"%lu", [p retainCount]);// [p release];// NSLog(@"%lu", [p retainCount]);// 错误的// //谁才有引用计数的概念:// //1.堆区空间才有引用计数的概念// //2.堆区的对象才会有引用计数// // }// Person *p = [[Person alloc] initWithName:@"张三" gender:@"男" age:18];// NSLog(@"%lu", [p retainCount]);// [p retain];// NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];// // // // [p autorelease];// // NSLog(@"%lu",[p retainCount]);// // // // [pool release];// NSLog(@"%lu",[p retainCount]);// //企业级题// @autoreleasepool {// for (long i = 0; i < 100000000; i++) {// @autoreleasepool {// Person *per = [[Person alloc] init];// [per autorelease];// }// }// } //内存管理原则:当你对一个对象进行了 alloc, retain, copy 操作,你就对该对象拥有了所有权,要对该对象负责,对其进行release,或者autorelease操作 //在一个方法内部,要保证对象的+ 和 - 相等. //创建Person对象 @autoreleasepool { Person *p = [Person personWithName:@"张三" gender:@"男" age:44]; Person *p1 = [p copy]; [p1 sayHi]; [p1 release]; } //内存问题: //1.野指针错误:最后一个release玩,空间已经被系统回收,如果再访问,就是访问一块没有所有权的空间,出现野指针,野指针不会立即报错,但是存在安全隐患,另外,错误不容易排错. //2.过度释放:对一块没有所有权的空间进行释放空间,会造成程序的立即crash; //3.内存泄露:对一块拥有所有权的空间,使用完之后没有释放,此时存在安全隐患,当内存泄露足够多得时候,造成程序的crash; return 0;}

person.h

#import 
@interface Person : NSObject
@property (nonatomic,retain) NSString *name;@property (nonatomic,retain) NSString *gender;@property (nonatomic,assign) NSInteger age;- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;+ (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age;- (void)sayHi;@end

person.m

#import "Person.h"@implementation Person- (instancetype)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{    if (self = [super init]) {        self.name = name;        self.gender = gender;        self.age = age;    }    return self;}+ (instancetype)personWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age{    return [[[self alloc] initWithName:name gender:gender age:age] autorelease];    }- (void)sayHi{    NSLog(@"sayHigoggo");}//当对一个兑现copy时,会自动调用该方法,用来创建新的对象,复制内容- (id)copyWithZone:(NSZone *)zone{    //1.创建新的对象    Person *newPer = [[Person allocWithZone:zone] init];    //2.拷贝内容    newPer.name = self.name;    newPer.age = self.age;    newPer.gender = self.gender;    //3.返回新的对象    return newPer;}//当对象的引用计数为0是系统会自动调用,切记不要人为调用- (void)dealloc{    NSLog(@"%@回收了",self);    [super dealloc];}@end

 

转载于:https://www.cnblogs.com/wohaoxue/p/4725506.html

你可能感兴趣的文章
经常使用的android弹出对话框
查看>>
确保新站自身站点设计的合理性的六大注意点
查看>>
promise
查看>>
Go 网络编程笔记
查看>>
[]Java面试题123道
查看>>
中间件与auth认证的那点儿所以然
查看>>
Scala
查看>>
Android 中LinearLayout控件属性
查看>>
面向对象之多态性
查看>>
树状数组
查看>>
【2019.8.14 慈溪模拟赛 T1】我不是!我没有!别瞎说啊!(notme)(BFS+DP)
查看>>
多任务--进程 及 进程间通信
查看>>
多线程/多进程+QProgressBar实现进度条
查看>>
多任务(进程)案例----- 拷贝文件夹
查看>>
Kotlin的快速入门
查看>>
底层原理
查看>>
21. Merge Two Sorted Lists
查看>>
shiro设置加密算法源码解析
查看>>
第二次冲刺
查看>>
实验四
查看>>