NSString 释放时崩溃

Posted

技术标签:

【中文标题】NSString 释放时崩溃【英文标题】:NSString crash when release 【发布时间】:2012-03-30 11:00:12 【问题描述】:

我使用 NSString 来附加字符串,但是当我释放“cacheStr”NSString 时,iphone 模拟器崩溃了。 我应该把发布代码放在哪里?

初始化代码:我使用三个 NSString 来追加 dataArray 的内容。



NSMutableArray *dataArray = [[NSMutableArray alloc] init];
NSString *cacheStr = [[NSString alloc] init];
NSString *tmpStr = [[NSString alloc] init];
NSString *notiyStr = [[NSString alloc] initWithFormat:@"This is a test message!"];
dataArray = [NSArray arrayWithObjects:
                      @"currency1.png",
                      @"currency2.png",
                      @"currency3.png",
                      @"currency4.png",
                      @"currency5.png",
                      @"xxxxxx",
                      @"currency1.png",
                      @"currency2.png",
                      @"currency3.png",
                      @"currency4.png",
                      @"currency5.png",
                      @"xxxxxx",
                      nil];

append string code : use for loop to append strings.


int isFailed = 0;
int countOfDataArray = [dataArray count];
if (!isFailed) 
    for (int i=0; i < countOfDataArray; i++) 
        if ([[dataArray objectAtIndex:i] isEqualToString:@"xxxxxx"]) 
            tmpStr = [cacheStr stringByAppendingFormat:@"%@\n", [dataArray objectAtIndex:i]];
        
        else 
            tmpStr = [cacheStr stringByAppendingFormat:@"value %d : %@\n", i+1, [dataArray objectAtIndex:i]];
        
        cacheStr = [tmpStr copy];
        [tmpStr release];
    

tmpStr = [notiyStr stringByAppendingString:cacheStr];

发布代码:当我添加[cacheStr release]时,模拟器会崩溃...

[dataArray 发布];
[notiyStr 发布];
// [cacheStr 释放]; /*  碰撞 ... */

谢谢!

【问题讨论】:

【参考方案1】:

像这样声明一个 NSString 更简单 NSString *tmpStr = @"This is a test message!"; 那么不需要释放它,当你不使用alloc时

【讨论】:

如果我必须使用 NSString initWithFormat XXX ... NSString stll 需要释放。也许我应该使用 c/c++ 的 sprintf 来做到这一点,NSString stringByAppendingString 似乎很难。【参考方案2】:

这个

NSMutableArray *dataArray = [[NSMutableArray alloc] init];
dataArray = [NSArray arrayWithObjects:
                  @"currency1.png",
                  @"currency2.png",
                  @"currency3.png",
                  @"currency4.png",
                  @"currency5.png",
                  @"xxxxxx",
                  @"currency1.png",
                  @"currency2.png",
                  @"currency3.png",
                  @"currency4.png",
                  @"currency5.png",
                  @"xxxxxx",
                  nil];

很奇怪!您正在分配一个可变数组并将指向该数组的指针分配给您不拥有的数组。当您尝试使用它时,它可能已经(自动)发布。因此int countOfDataArray = [dataArray count]; 将导致countOfDataArray 为零。因此cacheStr 永远不会被设置。仍然不应该在发布cacheStr 时崩溃。

改成:

NSMutableArray *dataArray = [[NSMutableArray alloc] initWithObjects: @"currency1.png",
                  @"currency2.png",
                  @"currency3.png",
                  @"currency4.png",
                  @"currency5.png",
                  @"xxxxxx",
                  @"currency1.png",
                  @"currency2.png",
                  @"currency3.png",
                  @"currency4.png",
                  @"currency5.png",
                  @"xxxxxx",
                  nil];

你应该没事的。

【讨论】:

不介意,但“因此 int countOfDataArray = [dataArray count]; 将导致 countOfDataArray 为零。”这是错误的。计数会在那里,因为它将分配新数组的新内存地址并且会起作用。 我的意思是:countOfDataArray 将为 0,因为 dataArray 为 nil,而将方法 count 发送到 nil 的结果为 0。 countOfDataArray 不会为 0,因为 dataArray 将指向新的内存位置,它将为 12。如果您有疑问,请实际检查。 这取决于分配发生的位置。如果分配和计数调用不在同一个范围内,我对此表示怀疑。 如果你尝试将他的代码粘贴到项目中,它会显示 12 个计数。所以有些误会。请检查你自己,让我们在这里结束这个话题。【参考方案3】:

不要使用 [NSString alloc] 初始化。使用 NSString value=@"Message";不需要释放它。

【讨论】:

如果我必须使用 NSString initWithFormat XXX ... NSString stll 需要释放。并感谢您的支持。

以上是关于NSString 释放时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

文字 NSString 是自动释放还是需要释放?

NSString 释放问题

NSString版本

objc:具有 NSString 的强属性

NSString 到 C 风格的 char 数组在第二次调用 drawRect 时崩溃

使用 NSString 方法 boundingRectWithSize 时在 iOS 11 上崩溃