作为'新手',我一直盯着'文档和api参考'文档2小时试图弄清楚我做错了什么,我的眼球现在正在流血。以下代码不断在xcode 4中抛出“黄色三角形”警告。(格式不是字符串文字,没有格式参数)
我真的不知道我在做什么......但是,我想了解为什么和我得到这个警告以及如何让它消失。谢谢你的帮助。
-(IBAction)saveZip:(id)sender
{
zipCode = [[NSString alloc] initWithFormat:zipText.text];
[zipText setText:zipCode];
NSUserDefaults *zipDefault = [NSUserDefaults standardUserDefaults];
[zipDefault setObject:zipCode forKey:@"ZipCode"];
}
答案 0 :(得分:4)
您应该在initWithFormat:
方法中使用字符串文字作为格式,而不是字符串,因此您的调用应更正为:
zipCode = [[NSString alloc] initWithFormat:@"%@", zipText.text];
但是在你的例子中你根本不需要那个方法,因为你实际上没有改变字符串,所以接下来'修复步骤'可能是
zipCode = [zipText.text copy];
但是这也留下了一个未解决的问题 - 您以前的zipCode值将不会被释放并且只会泄漏。如果zipCode是类中的实例变量,则为其声明一个属性:
// Class interface
@property (nonatomic, copy) NSString *zipCode;
// Class implementation
@synthesize zipCode;
这样你就让编译器自动为你的变量合成setter和getter方法,为你处理内存管理。现在要改变你的iVar值你可以使用属性:
self.zipCode = zipText.text;
P.S。最后 - 不要忘记以dealloc
方法释放你的zipCode以避免内存泄漏
答案 1 :(得分:1)
initWithFormat:
期望格式字符串后跟一个与字符串中的格式说明符对应的参数列表。例如:
NSString *city = @"East Aurora";
NSString *state = @"NY";
NSInteger numericZip = 14052;
NSString *lastLineOfAddress = [[NSString alloc] initWithFormat:@"%@, %@ %d", city, state, numericZip];
在此示例中,lastLineOfAddress
将引用字符串@"East Aurora, NY 14052"
。格式字符串中有三种格式说明符。前两个格式说明符是%@
,它可以是任何对象类型的占位符。 %d
是十进制整数值的占位符。格式字符串后面的三个参数对应于这三个格式说明符。
(我看到其他人现在已经在你的问题上找到了一个可靠的答案,所以我会在这里切断我的答案。)