Objective c stringByAppendingString和retain

Objective c stringByAppendingString和retain,objective-c,cocoa,nsstring,retain,autorelease,Objective C,Cocoa,Nsstring,Retain,Autorelease,我将发布使用自动释放著名方法stringByAppendingString的示例方法的downside 3变体。(xcode 4.6.2.IOS项目中的非arc示例项目) 示例块1:不返回任何内容。只是一个奇怪的值指向nothing,但不为null。 示例块2:也不返回任何内容 示例块3:返回A1A2A3。如预期,但我认为它有泄漏。 我的问题是: a) 示例方法1在MAC项目中按预期工作,但在IOS项目中没有。 b) 样本块3是否包含泄漏? c) 查看示例块2中的注释。单词变成了A1、A1A2

我将发布使用自动释放著名方法stringByAppendingString的示例方法的downside 3变体。(xcode 4.6.2.IOS项目中的非arc示例项目)

示例块1:不返回任何内容。只是一个奇怪的值指向nothing,但不为null。
示例块2:也不返回任何内容
示例块3:返回A1A2A3。如预期,但我认为它有泄漏。

我的问题是:
a) 示例方法1在MAC项目中按预期工作,但在IOS项目中没有。
b) 样本块3是否包含泄漏?
c) 查看示例块2中的注释。单词变成了A1、A1A2,什么都没有。为什么?
d) 你会用不同的方式编写你自己的相同方法的代码吗?我在寻找安全的标准方法

谢谢


样本块1

样本块2

样本块3


我的回答是:只是因为我没有做错什么。而且通过调试过程收集变量值的步骤非常清晰


但是,在clean project之后,它以某种方式得到了解决。希望这可以为某些人节省时间。或者不知道内存芯片地址是否出了问题。

第一种方法是唯一正确进行内存管理的方法。第二个泄漏两个NSString实例,第三个泄漏三个NSString实例。如果您没有从第一个方法中获取字符串“A1A2A3”,那么错误就在该方法之外的某个地方


对于您发送的每个retain消息,您还必须使用相同的方法发送一条release或autorelease消息,除非您的方法名称以alloc或copy开头。在这种情况下,调用者需要释放返回的对象。

第一个方法是唯一正确进行内存管理的方法。第二个泄漏两个NSString实例,第三个泄漏三个NSString实例。如果您没有从第一个方法中获取字符串“A1A2A3”,那么错误就在该方法之外的某个地方


对于您发送的每个retain消息,您还必须使用相同的方法发送一条release或autorelease消息,除非您的方法名称以alloc或copy开头。在这种情况下,调用方需要释放返回的对象。

第二个和第三个块包含泄漏。一般的规则是,你保留你想要拥有的东西,当你不再需要它的时候,你就会释放它。第一个块非常好:返回一个自动释放的字符串,如果调用者想要拥有它,它将被调用者保留;如果不想拥有它,它将在第一个将被清理的自动释放池中释放

在第二块中,您正在执行以下操作:

word_=[[word_ stringByAppendingString:a2]retain];// word is A1A2
word_=[[word_ stringByAppendingString:a3]retain];// word is nothing !

字符串@“A1A2”的保留计数为2,在下一次自动释放池排水时,它的保留计数为1,但您丢失了对它的任何引用,因此它是泄漏。至于保留字符串@“A1A2A3”,这也不正确:调用方将决定是否要保留它。出于同样的原因,第三个挡块不正确。

第二个和第三个挡块包含泄漏。一般的规则是,你保留你想要拥有的东西,当你不再需要它的时候,你就会释放它。第一个块非常好:返回一个自动释放的字符串,如果调用者想要拥有它,它将被调用者保留;如果不想拥有它,它将在第一个将被清理的自动释放池中释放

在第二块中,您正在执行以下操作:

word_=[[word_ stringByAppendingString:a2]retain];// word is A1A2
word_=[[word_ stringByAppendingString:a3]retain];// word is nothing !
字符串@“A1A2”的保留计数为2,在下一次自动释放池排水时,它的保留计数为1,但您丢失了对它的任何引用,因此它是泄漏。至于保留字符串@“A1A2A3”,这也不正确:调用方将决定是否要保留它。出于同样的原因,第三个块不正确

a) 哪个样块3-包括泄漏

样本中每次使用
-retain
都是意外的,可能会导致泄漏

b) 看看示例块中的注释。单词变成A1、A1A2,什么都没有。为什么

请再核对一下

c) 对于同一种方法,你会用不同的方式对自己进行编码吗?我在寻找安全的标准方法

您可以使用可变字符串,例如:

- (NSString*)sampleMethod
{
    NSMutableString * word = NSMutableString.string;
    NSString *a1=@"A1";
    NSString *a2=@"A2";
    NSString *a3=@"A3";

    [word appendString:a1];
    [word appendString:a2];
    [word appendString:a3];

    return [NSString stringWithString:word];
}
或格式字符串:

- (NSString *)sampleMethod
{
    NSString *a1=@"A1";
    NSString *a2=@"A2";
    NSString *a3=@"A3";

    return [NSString stringWithFormat:@"%@%@%@", a1, a2, a3];
}
然后根据您的实际输入进行混合和匹配

a) 哪个样块3-包括泄漏

样本中每次使用
-retain
都是意外的,可能会导致泄漏

b) 看看示例块中的注释。单词变成A1、A1A2,什么都没有。为什么

请再核对一下

c) 对于同一种方法,你会用不同的方式对自己进行编码吗?我在寻找安全的标准方法

您可以使用可变字符串,例如:

- (NSString*)sampleMethod
{
    NSMutableString * word = NSMutableString.string;
    NSString *a1=@"A1";
    NSString *a2=@"A2";
    NSString *a3=@"A3";

    [word appendString:a1];
    [word appendString:a2];
    [word appendString:a3];

    return [NSString stringWithString:word];
}
或格式字符串:

- (NSString *)sampleMethod
{
    NSString *a1=@"A1";
    NSString *a2=@"A2";
    NSString *a3=@"A3";

    return [NSString stringWithFormat:@"%@%@%@", a1, a2, a3];
}

然后根据您的实际输入进行混合和匹配。

如果您的代码没有执行它应该执行的操作,请放入断点并检查它,如果您看到它没有执行代码所说的操作,则是时候清理了。仅供参考,编写此代码的惯用方法是
NSString*word_=[NSString stringWithFormat:@“%@%@@”,a1、a2、a3]
。我认为这只是了解内存管理工作原理的一个例子。否则,他可能会返回@“A1A2A3”。您如何检查这些字符串?如果您的代码没有执行它应该执行的操作,请放入断点并检查它,如果您看到它没有执行代码所说的操作,则是时候清理了。仅供参考,编写此代码的惯用方法是
NSString*word=[nsstringwithformat:@“%@%@@”,a1、a2、a3]
。我认为这只是了解内存管理工作原理的一个例子。否则他可以返回@“A1A2A3”。你如何检查这些字符串?我的感觉是一样的:示例块1就是它应该的。但样本块1;如问题所示,不返回任何内容。这是什么意思?示例块1在Mac应用程序中返回A1A2A3。但IOS中的emptystring(返回一个奇怪的指针,它不会给出任何错误,但会像emptystring一样处理)我也有同样的感觉:示例块1就是它应该得到的。但样本块1;如所述,不返回任何内容。这是什么意思?示例块1返回A1A2A