【发布时间】:2013-07-08 21:22:22
【问题描述】:
我将发布使用自动释放著名方法 stringByAppendingString 的示例方法的缺点 3 变体。(xcode 4.6.2.IOS 项目中的非弧示例项目)
示例块 1:什么都不返回。只是一个奇怪的指向什么都没有。但不是 null。
示例块 2:也不返回任何内容!
样本块 3:返回 A1A2A3。正如预期的那样,但我认为它有泄漏。
我的问题是:
a) 示例方法 1 在 MAC 项目中按预期工作。但在 IOS 项目中没有。
b) 样品块 3 - 包括泄漏?
c) 查看示例块 2 中的 cmets。word_ 变为 A1、A1A2 并且什么都没有。为什么?
d) 你会用不同的方式编写你自己的相同方法的代码吗?我正在寻找安全的标准方法。
谢谢。
示例块 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_;
}
示例块 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_;
}
示例块 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 *word_ = [NSString stringWithFormat:@"%@%@%@", a1, a2, a3]。 -
我认为这只是一个了解内存管理工作原理的示例。否则他可以返回@"A1A2A3"。
-
你是如何检查这些字符串的?
标签: objective-c cocoa nsstring retain autorelease