Objective-C新手遇到的NSString问题

4

我有这段代码:

// Fill out the email body text
NSString *emailBody = (@"Name:%@\nNumber of People:\nDate:", name.text);
NSLog(@"%@", emailBody);

您可以看到,我正在尝试将name.text附加到“Name:”后面的电子邮件正文中。但是,NSLog只输出name.text中包含的字符串,而不是邮件正文的其余部分。我在这里做错了什么,导致代码删除了除name.text之外的字符串?

例如,如果name.text包含文本“ Jack”,那么NSLog只会输出“ Jack”,而不是以下内容:

Name: Jack
Number of People: x 
Date: x

这正是我在寻找的。

有人能告诉我我做错了什么吗?

谢谢,

杰克

3个回答

12

使用+ stringWithFormat方法:

NSString *emailBody = [NSString stringWithFormat:@"Name:%@\nNumber of People:\nDate:", name.text];

你现在有一份有效的代码,但它不能完成你想要的功能:

(@"Name:%@\nNumber of People:\nDate:", name.text);

调用逗号运算符 - 它评估其第一个参数,丢弃它并返回第二个参数,因此这就是为什么emailBody最终填充了name.text值的原因


...并解释了逗号运算符。 - David Gelhar

0
通常你想要使用建议的stringWithFormat,它创建一个遵循给定格式的自动释放字符串,或者你可以使用initWithFormat来创建一个你可以手动管理以获得更好的内存行为的字符串,如果有必要的话。
一些书籍会坚持认为对于内存有限的 iPhone 来说,不要过度依赖自动释放对象,所以你经常会找到这种替代方案:
NSString *emailBody = [[NSString alloc] initWithFormat:@"Name:%@\nNumber of People:\nDate:", name.text];

然后您可以使用“emailBody”,并在完成后立即输入以下行:

[emailBody release];

一般来说,这是一个好习惯。


呃,避免自动释放对象比“绝对必要”更多是过度杀伤力的,无论“某些书籍”坚持什么。也许选择其他书籍? - David Gelhar

0

你应该编写

NSString *emailBody = [@"Name:%@\nNumber of People:\nDate:" stringByAppendingString:name.text];

或者,如果它不能编译,

[[NSString stringWithString:@"姓名:%@\n人数:\n日期:"] stringByAppendingString:name.text]


1
为什么会“无法编译”?-stringByAppendingString:是一个NSString方法;@"Name:%@\nNumber of People:\nDate:"也是一个NSString。正如字符串编程指南所说,“您也可以像处理其他字符串一样直接向字符串常量发送消息”。 - David Gelhar
是的,谢谢澄清。我只是不确定,所以添加了可能的解决方法 :) - Nickolay Olshevsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接