Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么在原始NSString对象被释放后,NSString的小写字符串没有被释放?_Objective C_Nsstring - Fatal编程技术网

Objective c 为什么在原始NSString对象被释放后,NSString的小写字符串没有被释放?

Objective c 为什么在原始NSString对象被释放后,NSString的小写字符串没有被释放?,objective-c,nsstring,Objective C,Nsstring,请检查以下代码: CFUUIDRef uuid=CFUUIDCreate(kCFAllocatorDefault); NSString *strUuid=(NSString *)CFUUIDCreateString(kCFAllocatorDefault,uuid); NSString *lowerUuid=[strUuid lowercaseString]; NSLog(@"strUuid retainCount:%tu",[strUuid retainCount]); CFRelease(s

请检查以下代码:

CFUUIDRef uuid=CFUUIDCreate(kCFAllocatorDefault);
NSString *strUuid=(NSString *)CFUUIDCreateString(kCFAllocatorDefault,uuid);
NSString *lowerUuid=[strUuid lowercaseString];
NSLog(@"strUuid retainCount:%tu",[strUuid retainCount]);
CFRelease(strUuid);
CFRelease(uuid);
NSLog(@"lowerUuid retainCount:%tu",[lowerUuid retainCount]);
NSLog(@"lowerUuid:%@",lowerUuid);
在非arc项目中运行此代码,输出将为:

strUuid retainCount:1
lowerUuid retainCount:1
lowerUuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
小写字符串是NSString的一个属性,其定义为:

@property (readonly, copy) NSString *lowercaseString;
因此,可以合理地推断,如果原始NSString对象被释放,lowercaseString属性将在NSString的dealoc方法中被释放。
但是为什么在上面的代码中,即使在原始struid被释放之后,loweruid仍然存在?

首先,标准免责声明:不要看
-retainCount
。它有许多使用注意事项,不能真正信任任何有用的东西

也就是说:你的推论并不能描述发生了什么。当你问
struid
一个
-小写的
时,你不会得到某种“child”对象。生成的小写字符串是一个完全独立的对象,具有自己的内部保留计数。(原始字符串可能会保留其对小写字符串的引用,但这与您无关。)


在您的代码片段中,根据标准内存管理约定,通常情况下,语句
[struid lowercasesetring]
返回一个“autoreleased”对象。因此,即使原始字符串被释放,返回给您的字符串仍然有效:(a)至少在自动释放池被清理之前,或者(b)在其最后一次实际访问之后,这取决于项目上的ARC状态。

首先,标准免责声明:不要查看
-重新登录
。它有许多使用注意事项,不能真正信任任何有用的东西

也就是说:你的推论并不能描述发生了什么。当你问
struid
一个
-小写的
时,你不会得到某种“child”对象。生成的小写字符串是一个完全独立的对象,具有自己的内部保留计数。(原始字符串可能会保留其对小写字符串的引用,但这与您无关。)


在您的代码片段中,根据标准内存管理约定,通常情况下,语句
[struid lowercasesetring]
返回一个“autoreleased”对象。因此,即使原始字符串被释放,返回给您的字符串仍然有效:(a)至少在自动释放池被清理之前,或者(b)在其最后一次实际访问之后,这取决于项目上的ARC状态。

首先,标准免责声明:不要查看
-重新登录
。它有许多使用注意事项,不能真正信任任何有用的东西

也就是说:你的推论并不能描述发生了什么。当你问
struid
一个
-小写的
时,你不会得到某种“child”对象。生成的小写字符串是一个完全独立的对象,具有自己的内部保留计数。(原始字符串可能会保留其对小写字符串的引用,但这与您无关。)


在您的代码片段中,根据标准内存管理约定,通常情况下,语句
[struid lowercasesetring]
返回一个“autoreleased”对象。因此,即使原始字符串被释放,返回给您的字符串仍然有效:(a)至少在自动释放池被清理之前,或者(b)在其最后一次实际访问之后,这取决于项目上的ARC状态。

首先,标准免责声明:不要查看
-重新登录
。它有许多使用注意事项,不能真正信任任何有用的东西

也就是说:你的推论并不能描述发生了什么。当你问
struid
一个
-小写的
时,你不会得到某种“child”对象。生成的小写字符串是一个完全独立的对象,具有自己的内部保留计数。(原始字符串可能会保留其对小写字符串的引用,但这与您无关。)


在您的代码片段中,根据标准内存管理约定,通常情况下,语句
[struid lowercasesetring]
返回一个“autoreleased”对象。因此,即使原始字符串被释放,返回给您的字符串仍然有效:(a)至少在自动释放池被清理之前,或者(b)在最后一次实际访问之后,这取决于项目的ARC状态。

我认为这不是一个合理的推断。
copy
属性可能意味着返回的值是原始字符串的一个副本,带有它自己的保留计数。我认为这不是一个合理的推断。
copy
属性可能意味着返回的值是原始字符串的一个副本,带有它自己的保留计数。我认为这不是一个合理的推断。
copy
属性可能意味着返回的值是原始字符串的一个副本,带有它自己的保留计数。我认为这不是一个合理的推断。
copy
属性可能意味着返回的值是原始字符串的一个副本,包含它自己的保留计数。回答得好。展开一点:仅仅因为某个东西被声明为
@属性
,并不意味着它是某种从属对象。只读属性只是一个getter方法,可以返回其实现者想要的任何内容。有些东西被声明为@property并不意味着它是某种从属对象!这就是让我困惑的一点,我曾经认为一个属性必须是一个坐标对象。谢谢回答得好。展开一点:仅仅因为某个东西被声明为
@属性
,并不意味着它是某种从属对象。只读属性只是一个getter方法,可以返回其实现者想要的任何内容。