———————————————————————————————————————————
NSString中的内存管理问题
由于autoreleasepool的存在,对于内存管理就会很复杂,retainCount 不能作为调试内存时的依据。
所以一般来说NS开头的类(或者说系统自己内部提供的类)基本上不需要我们做太多的内存管理,因为我们很难检测出来。
比如:
NSString *str=[[NSString alloc]initWithString:@"123123"];
NSLog(@"str retainCount=%tu",[str retainCount]);
输出的结果是:str retainCount=18446744073709551615
这里的值不是乱码,而是很大,简单的release一下根本不会使这个值改变(一般一点不会改变),所以我们不要对这种系统中原有的类型进行内存操作。
if(retainCount>0)
{
[str release];
}
这样很容易死循环。
———————————————————————————————————————————
autorelease 基本使用
(1)自动释放池 及 autorelease介绍
自动释放池:
①在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的
②当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中
(2)自动释放池的创建方式
iOS 5.0 以后
@autoreleasepool
{ //开始代表创建自动释放池
………
} //结束代表销毁自动释放池
(3)autorelease的原理
实际上autorelease只是把对release的调用延迟了,对于每一个autorelease,系统只是把该object放入了当前的autorelease pool中,当该pool释放时,该pool中所有的object会被一起调用release。
代码:
#import <Foundation/Foundation.h>
@interface Car : NSObject
-(void)run;
@end
@implementation Car
-(void)run
{
NSLog(@"Car run!");
}
- (void)dealloc
{
NSLog(@"Car dealloc!");
[super dealloc];
}
@end
int main(int argc, const char * argv[]) {
// 创建一个自动释放池
@autoreleasepool {
Car *car=[[[Car alloc]init]autorelease];//首先要用autorelease,那就一定得将ARC关掉
[car run];
NSString中的内存管理问题
由于autoreleasepool的存在,对于内存管理就会很复杂,retainCount 不能作为调试内存时的依据。
所以一般来说NS开头的类(或者说系统自己内部提供的类)基本上不需要我们做太多的内存管理,因为我们很难检测出来。
比如:
NSString *str=[[NSString alloc]initWithString:@"123123"];
NSLog(@"str retainCount=%tu",[str retainCount]);
输出的结果是:str retainCount=18446744073709551615
这里的值不是乱码,而是很大,简单的release一下根本不会使这个值改变(一般一点不会改变),所以我们不要对这种系统中原有的类型进行内存操作。
if(retainCount>0)
{
[str release];
}
这样很容易死循环。
———————————————————————————————————————————
autorelease 基本使用
(1)自动释放池 及 autorelease介绍
自动释放池:
①在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的
②当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中
(2)自动释放池的创建方式
iOS 5.0 以后
@autoreleasepool
{ //开始代表创建自动释放池
………
} //结束代表销毁自动释放池
(3)autorelease的原理
实际上autorelease只是把对release的调用延迟了,对于每一个autorelease,系统只是把该object放入了当前的autorelease pool中,当该pool释放时,该pool中所有的object会被一起调用release。
代码:
#import <Foundation/Foundation.h>
@interface Car : NSObject
-(void)run;
@end
@implementation Car
-(void)run
{
NSLog(@"Car run!");
}
- (void)dealloc
{
NSLog(@"Car dealloc!");
[super dealloc];
}
@end
int main(int argc, const char * argv[]) {
// 创建一个自动释放池
@autoreleasepool {
Car *car=[[[Car alloc]init]autorelease];//首先要用autorelease,那就一定得将ARC关掉
[car run];