NSString:如何在循环中使用子字符串?

时间:2010-09-02 22:29:38

标签: objective-c cocoa

sText是NSString类型的实例变量。不涉及任何属性。

下面的循环应该获取sText的第一个字符并将该char存储在sCurrentCharacter中。然后应将sText的其余部分重新分配给sText。这种情况一直持续到字符串被吃掉为止。 (我遗漏了所有对变量有意义的代码)。

while ([sText length] > 0)
{
// Get the current first ASCII character.
NSString *sCurrentCharacter = [sMorseText substringToIndex:1];
// Keep everything but the first character.
sText = [sText substringFromIndex:1];
}

问题:在重新分配“substringFromIndex”的结果之前,是否必须释放sText?如果是的话:为什么?如果没有:为什么不呢? : - )

2 个答案:

答案 0 :(得分:3)

这取决于您创建初始sText的方式。如果sText是自动释放的对象,或者您没有明确保留它,那么您没问题。如果您使用initcopyretain编辑了sText,那么您应该在while循环之前自动发布它。

所以这很好:

NSString *sText = @"foo";
while ([sText length] > 0){
   // Get the current first ASCII character.
   NSString *sCurrentCharacter = [sMorseText substringToIndex:1];
  // Keep everything but the first character.
  sText = [sText substringFromIndex:1];
}

这会泄漏sText的原始值:

NSString *sText = [myString retain];
while ([sText length] > 0){
   // Get the current first ASCII character.
   NSString *sCurrentCharacter = [sMorseText substringToIndex:1];
  // Keep everything but the first character.
  sText = [sText substringFromIndex:1];
}

答案 1 :(得分:0)

除了内存管理问题,这在Objective-C中是一种相当低效的方法(但对于LISP来说很棒!)。更有效的方法是:

NSUInteger iter, length = sText.length; // Only call -length once.
for (iter = 0; iter < length; iter++)
{
    unichar c = [sText characterAtIndex:iter];
    // Or, if you actually need it as an NSString:
    NSString *substr = [sText substringWithRange:(NSRange){ iter, 1 }];
}