如何发布字符集?

时间:2011-12-13 03:55:28

标签: objective-c

我对文字字段有疑问。我写信是为了让用户只能在文本字段中输入数字。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    static NSCharacterSet *charSet = nil;
    if(!charSet) {
        charSet = [[[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet] retain];
    }
    NSRange location = [string rangeOfCharacterFromSet:charSet];
    return (location.location == NSNotFound);
}

上面是代码,它现在工作正常,唯一的问题是如何释放charSet,因为我已经保留了它。如果我在这里发布它会崩溃。请给我发短信的方式。或者,如果我保持这样的话,它仍然可以吗?

2 个答案:

答案 0 :(得分:1)

你永远不应该保留charSet。当它涉及到它时它会被自动释放:它的存在时间足以让其余的代码运行,然后单独存在。

当然,如果您使用iOS 5和ARC,您将永远不必担心保留和再次发布......

编辑:哦,我知道问题是什么,你正在分配静态。那么,就像你正在做的那样保留它,然后让它泄漏。无论是使用实例变量还是使用实例变量,您都可以对其进行内存管理。抱歉第一次得错答案,但最好承认我不小心读了...... :)

另一个编辑:但为什么你分配给静态?你真的认为这会节省你很多时间吗?这不是“过早优化”的情况吗?计算机真的很快,比用户输入的速度快得多;我认为您的设备每次通过此例程都可以非常愉快地计算[[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet],而不会减慢速度。

答案 1 :(得分:0)

如果您只想验证用户是否输入了数字,那么您可以

- (BOOL)textField:(UITextField *)textField 
shouldChangeCharactersInRange:(NSRange)range 
replacementString:(NSString *)string
{
    if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"0123456789"]] length]) {
        return NO;
    }
    return YES;
}   

或只是将键盘设为数字键盘。

您的方法仅检查输入是否有数字,而不是仅包含数字。除非您已禁用复制/粘贴功能,否则您需要检查所有输入是否有效。