在我的介绍性Objc课程中,这是一个简单的挑战,这让我感到非常悲痛。我已经尝试了一些我在X-code API中选择的东西试图解决这个问题,但我没有运气。挑战规范包括一个限制:我不能更改for循环之外的任何代码,我的输出不能包含尾随逗号。它在当前的迭代中确实如此,我不知道如何摆脱它!
以下是当前形式的代码:
NSString *outputString = @"";
int loopMaximum = 10;
for (int counter = 1; counter <= loopMaximum; counter++) {
outputString = [NSString stringWithFormat:@"%@ %d,", outputString, counter];
//Not sure how to get rid of trailing comma =/
}
NSLog(@"%@", outputString);
答案 0 :(得分:5)
更好的方法是这样的:
NSMutableString *outputString = [NSMutableString string];
int loopMaximum = 10;
for (int counter = 1; counter <= loopMaximum; counter++) {
if (counter > 1) {
[outputString appendString:@", "];
}
[outputString appendFormat:@"%d", counter];
}
NSLog(@"%@", outputString);
答案 1 :(得分:1)
即使rmaddy的解决方案内存效率更高,OP也表示他不允许在“for循环”之外更改代码:
所以这是一个有效的解决方案:
NSString *outputString = @"";
int loopMaximum = 10;
for (int counter = 1; counter <= loopMaximum; counter++) {
outputString = [NSString stringWithFormat:@"%@%d%@", outputString, counter, (counter<loopMaximum)?@", ":@""];
}
NSLog(@"%@", outputString);
答案 2 :(得分:0)
一种更有效的方法如下。使用自动参考计数(ARC),
NSMutableString *outputString = [[NSMutableString alloc] init];
NSUInteger loopMaximum = 10;
for (NSUInteger counter = 1; counter <= loopMaximum; counter++)
{
if (counter == 1)
{
[outputString appendFormat:@"%d", counter];
continue;
}
[outputString appendFormat:@", %d", counter];
}
NSLog(@"%@", outputString);
对于手动引用计数(MRC),请在[outputString release];
之后附加NSLog();
。
NSString
与NSMutableString
在问题中给出的方法中,正在构建答案时重复创建NSString
个对象。内存的分配和复制非常慢,另外因为开始生成的对象是自动释放的,所以每次循环迭代时内存使用都会增加,并且直到下一次自动释放池的消耗才会释放。相反,更好的解决方案是使用NSMutableString
,NSString
是NSUInteger
的子类,用于变异/更改,并且可以更快地将字符附加到自身。
int
与int
在问题中给出的方法中,也使用NSInteger
。最好使用NSUInteger
和NSUInteger
作为they avoid problems with execution on 32/64bit processors。由于没有负数,因此使用无符号变量({{1}})也是可取的,因为它给出了更大的正范围。
传递消息可能会变得昂贵,尤其是在迭代时。通过将每次迭代传递的消息数限制为1,可以减少产生的开销。
答案 3 :(得分:0)
只需创建子字符串即可修剪最后一个字符。
string = [string substringToIndex:[string length] - 1];