对NSString*str感到困惑

Fro*_*ost 1 cocoa objective-c nsstring

我对NSString*str的行为感到困惑.

我以多种方式分配它,有时它可以工作,有时它变为空.

NSString *str = @"/hi/hello"; // this one always works
// this sometimes becomes null after the function ends
NSString *str2 = [str lastPathComponent]; 
// as above
NSString *str3 = [NSString stringWithString:str2];
NSString *str4 = [NSString initWithString:str3];
Run Code Online (Sandbox Code Playgroud)

我不太熟悉Obj-C的对象行为,它就像C++一样吗?

如果是这样,我怎么能安全地完成作业

string str = "hi";
string str2 = str;
Run Code Online (Sandbox Code Playgroud)

在C++中表现?

例如:我在.h文件中声明了一个字符串,

如何安全地分配它在函数结束后不会变为NULL?

我知道这是一个非常基本的问题,但我在NSString参考页面找不到答案.

非常感谢任何帮助!

wal*_*lky 7

这种行为不仅仅是C++.对象是引用计数的.如果你想保留一个,你必须对它提出要求.

如果您使用名称中包含该单词的方法自己创建对象alloc,new或者copy您已拥有所有权.这就像一个C++ new.(当你创建了一个对象时alloc,你还需要用一些名称开始的方法初始化它init.但是你必须先创建它.在C++中,这两个东西都被认为是单一构造行为的一部分.)

您从其他方法(例如您提到的三种NSString方法中的两种)接收的对象只是暂时可用,除非您通过调用明确声明所有权[object retain].如果你想让它们超越直接上下文,你只需要这样做.(在C++中,实际上没有相同的东西.)

无论您获得所有权,都必须在通过电话完成后放弃它[object release].这类似于C++ delete,除了在释放所有所有权声明之前实际上没有销毁该对象.

掌握这一点真的非常重要,也许是使用Objective-C时唯一需要知道的重要事项.仔细阅读对象所有权文档,您将进行排序.

  • 同样值得注意的是,即使它们被解除分配,物体也不会神奇地变为零.访问一个dealloced对象只是无效 - 它可能会使程序崩溃,或者它可能会做一些更奇怪的事情. (3认同)