gpt4 book ai didi

objective-c - stringByAppendingString 和保留困境

转载 作者:行者123 更新时间:2023-12-03 16:49:34 25 4
gpt4 key购买 nike

我将发布使用 autorelease 著名方法 stringByAppendingString 的示例方法的缺点 3 变体。(xcode 4.6.2.IOS 项目中的非 arc 示例项目)

示例 block 1:不返回任何内容。只是一个奇怪的指向任何内容的点。但不为 null。
示例 block 2:也不返回任何内容!
示例 block 3:返回 A1A2A3。正如预期的那样,但我认为它已经泄漏。

我的问题是:
a) 示例方法 1 在 MAC 项目中按预期工作,但在 IOS 项目中不工作。
b) sample block 3 是否存在泄漏?
c) 查看示例 block 2 中的注释。word_ 变为 A1、A1A2,什么也没有。为什么?
d)您会以不同的方式编写自己的相同方法的代码吗?我正在寻找安全的标准方法。

谢谢。

<小时/> 示例 block 1

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

word_=[word_ stringByAppendingString:a1];// word_ is A1
word_=[word_ stringByAppendingString:a2];// word is nothing but another pointer
word_=[word_ stringByAppendingString:a3];// word is nothing too but pointer changed.
return word_;
}

示例 block 2

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

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

示例 block 3

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

word_=[[word_ stringByAppendingString:a1]retain];// word_ is A1
word_=[[word_ stringByAppendingString:a2]retain];// word_ is A1A2
word_=[[word_ stringByAppendingString:a3]retain];// word_ is A1A2A3
return word_;//returns as expected but I think leaks method in this method.
}

<小时/>我的回答:只是因为我没有做错任何事。并且通过调试过程步骤非常敏锐地收集了变量值。

但在清理项目后不知怎的就解决了。希望这可以为某人节省几个小时。或者不知道内存芯片地址可能出了问题。

最佳答案

第一个是唯一能够正确进行内存管理的方法。第二个泄漏了两个 NSString 实例,第三个泄漏了三个 NSString 实例。如果您没有从第一个方法中获取字符串“A1A2A3”,则错误位于该方法之外的某个位置。

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

关于objective-c - stringByAppendingString 和保留困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17536194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com