initWithFormat 2小时后没有多大意义?

时间:2011-08-07 20:27:41

标签: iphone objective-c cocoa-touch

作为'新手',我一直盯着'文档和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"];
}

2 个答案:

答案 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是十进制整数值的占位符。格式字符串后面的三个参数对应于这三个格式说明符。

(我看到其他人现在已经在你的问题上找到了一个可靠的答案,所以我会在这里切断我的答案。)