美文网首页面试iOS学习记录
一个关于NSString内存管理的问题

一个关于NSString内存管理的问题

作者: koce_zhao | 来源:发表于2015-08-03 15:47 被阅读2626次

先来回顾strong和weak的使用。

Strong & Weak

在iOS 5以后,苹果引入了ARC技术和strong和weak对象变量属性。
事实上,strong关键字其实相当于之前版本的retain关键字,如果一个属性变量使用了strong关键字修饰,那么它指向的对象的引用计数就会+1(它拥有这个对象);而如果一个属性变量使用了weak关键字修饰,那么它指向的对象的引用计数则不变(它不拥有这个对象)。在此基础上,解释ARC技术的规则就会变得很简单:只要还有一个strong指针指向对象,那么对象就不会被销毁,反之,若没有strong指针指向对象,那么对象就会被立即销毁。而weak指针指向的对象若被销毁,那么weak指针会被赋值为nil,这样做的好处是防止野指针。

NSString使用strong & weak异常

前几天在使用__strong和__weak关键字是遇到了一个问题,先看以下代码:<pre><code>__strong NSString *string1 = @"string1";

__weak NSString *string2 = string1;

string1 = nil;

NSLog(@"string2 = %@",string2);</code></pre>按之前所说的strong和weak规则,我们先用一个使用__strong关键字修饰的NSString对象string1指向了一个字符串,再用一个使用__weak关键字修饰的NSString对象string2指向了同一个字符串,之后让string1指向了nil,此时,没有一个strong指针指向了这个字符串,那么这个字符串理应被系统销毁,而string2则应该指向nil,可打印结果却是:<pre><code>2015-08-03 15:32:24.045 test[6575:196538] string2 = string1</code></pre>我试着输出<code>[string class]</code>,代码如下:<pre><code>NSString *string1 = @"string 1";

NSLog(@"%@:%@", string1, [string1 class]);

</code></pre>打印结果则是:<pre><code>2015-08-04 15:33:51.385 test[6595:197912] string 1:__NSCFConstantString</code></pre>那么<code>__NSCFConstantString</code>是什么呢?其实<code>__NSCFConstantString</code>是一个字符串常量,是没有retainCount(引用计数)的,所以没有强指针指向它,它也不会被销毁。那么,怎么获得不是<code>__NSCFConstantString</code>的字符串呢?<pre><code>NSString *string1 = @"string 1";

NSString *string2 = [NSString stringWithString:@"string 2"];

NSString *string3 = [NSString stringWithFormat:@"string 3"];

NSString *string4 = [[NSString alloc] initWithString:@"string 4"];

NSString *string5 = [[NSMutableString alloc] initWithString:@"string 5"];

NSLog(@"%@:%@",string1,[string1 class]);

NSLog(@"%@:%@",string2,[string2 class]);

NSLog(@"%@:%@",string3,[string3 class]);

NSLog(@"%@:%@",string4,[string4 class]);

NSLog(@"%@:%@",string5,[string5 class]);

</code></pre><pre><code>2015-08-03 15:35:35.587 test[6631:201537] string 1:__NSCFConstantString

2015-08-03 15:35:35.587 test[6631:201537] string 2:__NSCFConstantString

2015-08-03 15:35:35.587 test[6631:201537] string 3:NSTaggedPointerString

2015-08-03 15:35:35.587 test[6631:201537] string 4:__NSCFConstantString

2015-08-03 15:35:35.588 test[6631:201537] string 5:__NSCFString
</code></pre>通过以上的运行结果,发现只有使用<code>[[NSMutableString alloc] initWithString:]</code>得到的NSString才是<code>__NSCFString</code>,所以我修改代码:<pre><code>__strong NSString *string1 = [[NSMutableString alloc] initWithString:@"string 1"];

__weak NSString *string2 = string1;

string1 = nil;

NSLog(@"string2 = %@", string2);
</code></pre><pre><code>2015-08-03 15:37:32.635 test[6646:202674] string2 = (null)</code></pre>结果符合。

相关文章

  • 一个关于NSString内存管理的问题

    先来回顾strong和weak的使用。 Strong & Weak 在iOS 5以后,苹果引入了ARC技术和str...

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • iOS基础:内存管理-NSString相关知识

    前言 本文主要讲的是NSString类有关的内存管理基础知识。 正文 一、面试常问的问题:为什么NSString的...

  • NSString内存管理

    NSString的内存优化 OC中的NSString不论是在编译时还是在运行时都做了很多的优化,并不同于普通的对象...

  • NSString 内存管理

    在学习自动释放池与RunLoop的关系的时候发现申明NSString类型的变量未随RunLoop的进入休眠而释放,...

  • NSString 的内存管理

    前段时间看了同事的分享,于是把它记录下来 先看下这几个测试代码,关于 NSString: 执行后打印输出结果: 可...

  • NSString 的内存问题

    NSString 在 OC 的内存管理策略中是一个特殊的存在,因为其在编译和运行中做了一些优化处理,不同于普通对象...

  • 【内存管理】NS与NSMutable的copy和strong..

    最近温习一下关于内存管理的东西。平常声明属性时候习惯性的NSString用copy,NSMutableString...

  • Foundation框架---NSString

    //创建字符串的方式 NSString*str3 =@"iOS";//系统会对内存自动做管理 NSString *...

  • [8]NSString内存管理

    NSSting内存 栈区(stack): 这个一般由编译器操作,或者说是系统管理,会存一些局部变量,函数跳转跳转时...

网友评论

  • bullet_wu:__strong NSString *string1 = @"string1"; 这个retaincount 并不等于1 ,string1指向的是常量,常量在app结束后释放,因此 string2并不等于nil,而你NSMutableString 使用了alloc 去初始化对象 retaincount = 1,和普通oc对象一样,因此在arc环境下 string2 = (null)

本文标题:一个关于NSString内存管理的问题

本文链接:https://www.haomeiwen.com/subject/ruevqttx.html