【问题标题】:Different among NSString and others Object Type? [duplicate]NSString 和其他对象类型有什么不同? [复制]
【发布时间】:2013-03-30 14:02:43
【问题描述】:
NSObject * obj1 = [[NSObject alloc] init];
NSLog(@"%d", [obj1 retainCount]);

NSString * string1 = [[NSString alloc] init];
NSLog(@"%d", [string1 retainCount]);

你能猜出结果吗?哦,我的上帝,它是“1 -1”!好奇怪!

【问题讨论】:

标签: objective-c nsstring


【解决方案1】:

首先...when should you use retain count?

永远不要使用retainCount

其次...

不,这并不奇怪,因为您正在查看一个永远不会被释放的字符串文字。

【讨论】:

  • 1) 你确定“一个永远不会被释放的字符串文字”? 2)在这种情况下,我分配初始化,而不是释放但retainCount仍然是-1!
  • 1) 是的,我确定。查看 all 其他有关 NSString 和释放或保留计数的问题。 2) 那是因为它总是是相同的值。再次停止查看保留计数!
【解决方案2】:

这里重要的一点是,您分配和初始化该表单的任何字符串都将返回相同的对象。这与创建 NSNull 相同。空字符串是一个常量,并且始终是同一个对象。

试试这个:

NSString * string1 = [[NSString alloc] init] ;
NSLog(@"%d %u", [string1 retainCount], string1);

NSString * string2 = [[NSString alloc] init];
NSLog(@"%d %u", [string2 retainCount], string2);

NSNull * theNULL = [NSNull null];
NSLog(@"%d %u", [theNULL retainCount], theNULL);

NSNull * theNULL2 = [[NSNull alloc] init];
NSLog(@"%d %u", [theNULL2 retainCount], theNULL2);

string1 和 string2 是相同的值,所以都指向空字符串。两个 NSNull 都一样。

这种行为解释了为什么每个 init 方法都以 self=[super init] 开头,因为在 null 字符串或 NULL 对象等情况下,init 可以更改 self。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-14
    • 2011-11-15
    • 1970-01-01
    • 2014-11-25
    • 2010-10-13
    • 1970-01-01
    • 2016-08-29
    • 2018-09-23
    相关资源
    最近更新 更多