iOS开发语言之OC 初级内存管理
2015-11-13 17:59
197 查看
出现内存问题一般有两个方面:
1.内存溢出:超出了给你限定的内存区域导致的问题(就跟用容器装水一样,超出了容器的水就会溢出)
2.野指针访问:对象的内存空间已经被系统回收,仍然使用指针操作这块内存。野指针操作是引起程序crash的主要原因。代码量越大越难找出野指针的位置
好了 下面我们来了解一下内存的管理 只有了解了内存管理才能够帮我们提升程序的性能,减少bug调试时间以及减少bug发生几率
首先 我们如何管理内存呢?
解决方案:对象有创建就要有销毁
所谓的内存管理就是对对象的创建和销毁的过程进行管理。
好了废话一大堆
下面来点实际的 内存整理中需要注意的事项
dealloc是继承自父类(NSObject)的方法,当对象的引用计数为0时,有系统使用该对象调用dealloc方法
dealloc方法我们不要自己调用
下面是dealloc方法的调用
先创建一个类的.m文件 在里面输入
//咱们不直接调用dealloc方法
//执行时机:当对象的retaincount为0的时候,系统会自动使用对象调用dealloc这个方法
-(void)dealloc{
NSLog(@"%@被释放了",self);
//调用父类的dealloc方法要放在最后写
[super
dealloc];
}
下面还有一个问题哦
是关于
autorelease:引用计数器:未来的某一时刻-1
自动释放池
NSAutoreleasePool类
当你创建对象不想立即释放的时候可以使用autorelease,那么会把对象的所有权交给最近NSAutoreleasePool对象
autoreleasepool控制使用autorelesa对象的释放。
这个对象如何释放取决于这个autoreleasepool
@autoreleasepool
{
Person
*person3=[[Person
alloc]init];
[person3
retain];
[person3
autorelease];
NSLog(@"person3=%lu",person3.retainCount);
}
再然后就是copy(拷贝)问题了
想要copy一个对象,也就是生成一个副本。需要先遵循NSCopying协议,NSCopying协议中有一个必须实现的协议方法,就会导致崩溃。我们需要在copyWithZone这个方法中定义copy的细节实现。
在类的.m文件中
@synthesize name=_name;
@synthesize num=_num;
//当对象执行copy方法时,会执行copyWithZone方法
-(id)copyWithZone:(NSZone *)zone{
//创建一个新的同类型的对象
Person *person=[Person
allocWithZone:zone];
//将被copy对象的值,赋值给新创建出来的实例对象,既完成了copy方法,
person.name=self.name;
person.num=self.num;
return person;
}
最后
@"换换"这个字符串存在常量区,常量区的东西不能被打印
NSString *yu=@"换换";
NSLog(@"yu=%lu",yu.retainCount);
[yu release];
NSLog(@"yu=%lu",yu.retainCount);
1.内存溢出:超出了给你限定的内存区域导致的问题(就跟用容器装水一样,超出了容器的水就会溢出)
2.野指针访问:对象的内存空间已经被系统回收,仍然使用指针操作这块内存。野指针操作是引起程序crash的主要原因。代码量越大越难找出野指针的位置
好了 下面我们来了解一下内存的管理 只有了解了内存管理才能够帮我们提升程序的性能,减少bug调试时间以及减少bug发生几率
首先 我们如何管理内存呢?
解决方案:对象有创建就要有销毁
所谓的内存管理就是对对象的创建和销毁的过程进行管理。
好了废话一大堆
下面来点实际的 内存整理中需要注意的事项
dealloc是继承自父类(NSObject)的方法,当对象的引用计数为0时,有系统使用该对象调用dealloc方法
dealloc方法我们不要自己调用
下面是dealloc方法的调用
先创建一个类的.m文件 在里面输入
//咱们不直接调用dealloc方法
//执行时机:当对象的retaincount为0的时候,系统会自动使用对象调用dealloc这个方法
-(void)dealloc{
NSLog(@"%@被释放了",self);
//调用父类的dealloc方法要放在最后写
[super
dealloc];
}
下面还有一个问题哦
是关于
autorelease:引用计数器:未来的某一时刻-1
自动释放池
NSAutoreleasePool类
当你创建对象不想立即释放的时候可以使用autorelease,那么会把对象的所有权交给最近NSAutoreleasePool对象
autoreleasepool控制使用autorelesa对象的释放。
这个对象如何释放取决于这个autoreleasepool
@autoreleasepool
{
Person
*person3=[[Person
alloc]init];
[person3
retain];
[person3
autorelease];
NSLog(@"person3=%lu",person3.retainCount);
}
再然后就是copy(拷贝)问题了
想要copy一个对象,也就是生成一个副本。需要先遵循NSCopying协议,NSCopying协议中有一个必须实现的协议方法,就会导致崩溃。我们需要在copyWithZone这个方法中定义copy的细节实现。
在类的.m文件中
@synthesize name=_name;
@synthesize num=_num;
//当对象执行copy方法时,会执行copyWithZone方法
-(id)copyWithZone:(NSZone *)zone{
//创建一个新的同类型的对象
Person *person=[Person
allocWithZone:zone];
//将被copy对象的值,赋值给新创建出来的实例对象,既完成了copy方法,
person.name=self.name;
person.num=self.num;
return person;
}
最后
@"换换"这个字符串存在常量区,常量区的东西不能被打印
NSString *yu=@"换换";
NSLog(@"yu=%lu",yu.retainCount);
[yu release];
NSLog(@"yu=%lu",yu.retainCount);
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- 你应该学习哪种编程语言?
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- [转]我们需要一种其他人能使用的编程语言
- Lua的内存管理浅析
- C#语言主要特性总结
- C语言中static的作用及C语言中使用静态函数有何好处
- PHP检测用户语言的方法
- JavaScipt基本教程之JavaScript语言的基础
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- iOS开发之路--微博“更多”页面
- 检测iOS设备是否越狱的方法
- 深入探讨PHP中的内存管理问题