NSString基础知识 - 内存 - 保留 - 复制

Sag*_*ari 2 iphone memory-management objective-c nsstring

这是我的代码:

NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];
Run Code Online (Sandbox Code Playgroud)

现在我正在采取其他字符串,如下所示.

NSString *x2=[xyz copy];
Run Code Online (Sandbox Code Playgroud)

我不知道到底会发生什么?是这样的,x2有xyz的ref的参考吗?

NSString *x3=[xyz retain];
Run Code Online (Sandbox Code Playgroud)

这里会发生什么,x3有一个新的内存有复制的字符串或[xyz copy]吗?

现在,如何从内存中删除所有这三个字符串?

Vla*_*mir 6

NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];
Run Code Online (Sandbox Code Playgroud)

这将创建自动释放的NSString实例 - 它将在自动释放池耗尽时释放(通常在下一个运行循环中).

NSString *x2 = [xyz copy];
Run Code Online (Sandbox Code Playgroud)

理论上,-copy消息将创建一个具有保留计数1的对象的新实例(即必须将其释放到某处),但由于NSString对象是不可变的,因此[xyz copy]将优化为[xyz retain],因此它将指向相同的实例.

NSString *x3=[xyz retain];
Run Code Online (Sandbox Code Playgroud)

x3将指向与xyz(和x2)相同的实例,并且其保留计数将递增 - 您必须在某处释放您的对象.

现在,如何从内存中删除所有这三个字符串?

确保将所有保留(复制)消息与释放和内存配对将被释放.
阅读Objective-c内存管理指南以获取更多详细信息.

  • 我不能同意你的最后一段.字符串[xyz/x3]应该释放一次,字符串x2应该释放一次.尽管您正在使用的库的实现恰好使它们成为相同的实例,但您的代码应该假设x2是对象的副本,而不是引用.有一天,你的"复制= =同一对象"假设会破裂. (2认同)