• 很有意思的NSString 和 Autorelease


    一个方法,返回一个NSString对象,在事件中调用方法.并尝试release 方法返回的NSString对象.

    -(NSString*) createNewString{
        //情况1
        return [[[NSString alloc] initWithFormat:@"%@",@"1223344"] autorelease];
       //情况2
        return [[[NSString alloc] initWithString:@"1223344"] autorelease];
       // 情况3
       return @"1223344";
    }
    
    //调用方法,在事件中
    - (IBAction)TouchDown:(id)sender {
       NSString* str = [self  createNewString];
        NSLog(@"输出1 , count : %d" , [str retainCount]);
       [str release];
        NSLog(@"输出2 , count : %d" , [str retainCount]);
    }
    

    情况1 :

    2011-09-08 21:33:38.817 AutoRelease[718:b303] 输出1 count : 1
    2011-09-08 21:33:38.819 AutoRelease[718:b303] *** -[CFString retainCount]: message sent to deallocated instance 0x4e50c60

    此时xcode断点停留在  输出2... 本来以为是输出2抛错. 理解为:  一个被回收的对象,不能执行方法retainCount . (单纯被回收 和 nil 是否有区别下次学习)

    注释 输出2

    结果为 :

    2011-09-08 21:35:02.690 AutoRelease[745:b303] 输出1 count : 1
    2011-09-08 21:35:02.692 AutoRelease[745:b303] *** -[CFString release]: message sent to deallocated instance 0x6895940

    断点已经跑到main方法中去了. 此时确定为 [str release]; 方法抛错.  理解为:   对于一个 autorelease 的对象.不能手工进行 release操作.

    修改一下调用方法:

    - (IBAction)TouchDown:(id)sender {
    NSString
    * str = [[self createNewString] retain];
    NSLog(
    @"输出1 count : %d" , [str retainCount]);
    [str release];
    NSLog(
    @"输出2 count : %d" , [str retainCount]);
    }

    此时方法执行通过,无异常.输出为:

    2011-09-08 21:40:42.029 AutoRelease[804:b303] 输出1 count : 2
    2011-09-08 21:40:42.030 AutoRelease[804:b303] 输出2 count : 1

    理解为: 当你需要操作 一个被autorelease的对象时. 可以首先 retain 他,然后在不在需要他的时候,release他  .  (这个是对象所有权的问题)  ..  retain == 计数器+1

     ----------------------------------- ----------------------------------- ----------------------------------- -----------------------------------

    情况2 , 情况 3 :  方法  在修改前 和修改后2种代码下,都能运行过去.

    输出都为:

    2011-09-08 21:49:16.993 AutoRelease[864:b303] 输出1 count : 2147483647
    2011-09-08 21:49:16.995 AutoRelease[864:b303] 输出2 count : 2147483647

    理解为:  initWithString:@"1223344" ,创建了一个 常量 字符串.并被系统限定为不可release和retain的对象. 有点类似 苹果推荐的单例模式

    注:  2147483647  是  UINT_MAX 的值

    如果方法返回  return [[[NSString alloc] init]  stringByAppendingString:@"Hello World!"];

    这个里面会存在内存泄露吗??? 继续研究....

    可以参考的:http://stackoverflow.com/questions/1390334/nsstring-retain-count



  • 相关阅读:
    帝国CMS自定义页面的添加与目录式链接的处理
    帝国CMS链接域名重写、伪静态处理
    帝国CMS模板中的多条件筛选方法
    js—input框中输入数字,动态生成内容的方法
    在navcat中清空数据后,设置id归零方法
    解决Vscode编辑器不能打开多标签页问题
    Win10系统下插入耳机前面板无声后面板有声的处理
    处理Chrome等浏览器无法上网,但QQ能正常使用问题
    vue+webpack前端开发项目的安装方法
    Ajax请求返回Error:200无数据的解决方法
  • 原文地址:https://www.cnblogs.com/jifsu/p/2172863.html
Copyright © 2020-2023  润新知