objective-c - 对 NSString *str 感到困惑

标签 objective-c cocoa 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];

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

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

string str = "hi";
string str2 = str;

在 C++ 中表现如何?

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

如何安全地分配它,使其在函数结束后不会变成NULL?

我知道这是一个非常基本的问题,但我在 NSString 引用页中找不到答案。

非常感谢您的帮助!

最佳答案

其行为不仅仅像 C++。对象是引用计数的。如果您想保留一个,则必须对其提出 claim 。

如果您自己使用名称包含单词 allocnewcopy 的方法自行创建对象,那么您就已经拥有所有权。这就像 C++ new。 (当你使用 alloc 创建了一个对象时,你还需要使用一些名称以 init 开头的方法来初始化它。但是你必须先创建它。在 C++ 中,这两件事将被视为单一施工行为的一部分。)

从其他方法(例如您提到的三个 NSString 方法中的两个)接收的对象仅暂时可用,除非您通过调用 [object keep] 明确声明所有权。仅当您希望将它们保留在当前上下文之外时,才需要执行此操作。 (C++ 中并没有真正的等效项。)

无论您如何获得所有权,您都必须在完成后通过调用[对象释放]放弃它。这有点像 C++ delete,只不过对象在所有所有权声明都被释放之前不会被真正销毁。

掌握这一点真的非常非常重要,也许这是使用 Objective-C 时需要知道的唯一重要的事情。阅读object ownership documentation仔细一点,你就会被分类。

关于objective-c - 对 NSString *str 感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3088917/

相关文章:

iphone - 如何获取iphone图库中图像的路径

ios - 可见 SQLite 文件但在 iOS 模拟器中不可见数据

objective-c - Objective C 中的 Malloc 错误

xcode - OSX Cocoa NSButton类型复选框 "Select all "问题,如何解决?

ios - FBRequestConnection 不工作

ios - NSStrings 的 NSArray 在一个对象中只返回一个大字符串,我需要很多对象

iphone - NSString 删除字符串中的单引号

iphone - 你如何在 NSUserDefaults 中存储多个 UIControlState 实例?

iphone - 指针与 nil 初始化指针

objective-c - 核心数据对象删除导致应用程序崩溃