我对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参考页面找不到答案。
非常感谢任何帮助!
答案 0 :(得分:7)
行为不仅仅是C ++。对象是引用计数的。如果你想保留一个,你必须对它提出索赔。
如果您使用名称中包含单词alloc
,new
或copy
的方法自行创建对象,那么您已拥有所有权。这就像C ++ new
。 (当您使用alloc
创建对象时,还需要使用名称以init
开头的方法对其进行初始化。但是您必须先创建它。在C ++中,这两个部分都将被视为单一的建设行为。)
您从其他方法(例如您提及的三种NSString方法中的两种)接收的对象只是暂时可用,除非您通过调用[object retain]
明确声明所有权。如果你想让它们超越直接上下文,你只需要这样做。 (在C ++中并没有与之相当的东西。)
但是,您获得了所有权,通过致电[object release]
,您必须放弃它。这类似于C ++ delete
,除了在释放所有所有权声明之前实际上没有销毁该对象。
掌握这一点真的非常重要,也许只有 重要的事情,你需要知道使用Objective-C。仔细阅读object ownership documentation,您将被排序。
答案 1 :(得分:2)
我假设你没有使用垃圾收集?如果是这种情况,则需要保留字符串。
NSString* str2 = [[str lastPathComponent] retain];
我建议你阅读一些关于objective-c内存管理的内容。
答案 2 :(得分:2)
NSString *str = @"/hi/hello";
这是有效的,因为它创建了一个字符串文字。这个问题的答案值得一读,以便在Objective-C
中理解这些What's the difference between a string constant and a string literal?
在所有这些情况下,您都在创建自动释放的字符串。当您返回应用程序的runloop时,这些将被释放。
NSString *str2 = [str lastPathComponent];
NSString *str3 = [NSString stringWithString:str2];
在最后一个中我假设你的意思是[[NSString alloc] initWithString:str3]
这会创建一个保留的字符串。但这不是创建静态字符串的好方法。 您应该在实现文件中创建静态字符串,如此
static NSString *myConstant = @"constantString"