Objective-C 【autorelease基本使用】

———————————————————————————————————————————
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];
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值