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?如果是的话:为什么?如果没有:为什么不呢? : - )
勒
答案 0 :(得分:3)
这取决于您创建初始sText
的方式。如果sText
是自动释放的对象,或者您没有明确保留它,那么您没问题。如果您使用init
,copy
或retain
编辑了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 }];
}