对NSString * str感到困惑

时间:2010-06-21 22:24:16

标签: 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参考页面找不到答案。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:7)

行为不仅仅是C ++。对象是引用计数的。如果你想保留一个,你必须对它提出索赔。

如果您使用名称中包含单词allocnewcopy的方法自行创建对象,那么您已拥有所有权。这就像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"