Iphone 自动释放,函数完成时释放对象

Iphone 自动释放,函数完成时释放对象,iphone,memory-management,Iphone,Memory Management,我有一个关于自动释放的问题 我知道当我以这种方式创建对象时: - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { static NSCharacterSet *charSet = nil; if (!charSet) { charSet = [[[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedS

我有一个关于自动释放的问题

我知道当我以这种方式创建对象时:

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{ 
   static NSCharacterSet *charSet = nil;
    if (!charSet) {
        charSet = [[[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet] retain];
    }
    NSRange loc = [(NSString*)textField.text rangeOfCharacterFromSet:charSet];
    if (loc.location != NSNotFound) {
        UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"error!",@"")
                                                             message:@"description."
                                                            delegate:self
                                                   cancelButtonTitle:NSLocalizedString(@"OK",@"")
                                                   otherButtonTitles:nil];
        [errorAlert show];
        [errorAlert release];
        return NO;

    }
    return YES;
}
对象自动释放


我有一个问题-为什么在这个对象上有一个retain,原因是-对象在第一次调用函数后被释放?

这是因为字符集被声明为静态的。正常的作用域规则适用,因此它仅在该方法中可见。但是,静态变量不存在于堆栈上,并且在方法返回时保留它们的值,因此如果再次调用它,它们仍然具有相同的值。这就是为什么会有“if(!charSet)”-这会检查对象是否已经创建,如果已经创建了,那么可以重用现有对象


如果没有-retain,NSCharacterSet对象将自动删除,并且它所在的内存块可以(并且将)用于其他用途。但是当发生这种情况时,指向该内存的
charSet*
指针不会重置为nil。它仍然具有旧的价值;由于该值为非nil,因此如果(!charSet)为false,则不会创建新对象。但是,由于旧对象已被销毁,因此无法确定该指针指向的内存中可能有什么-它可能是随机垃圾,也可能是其他对象,也可能是任何对象。

好的,greeat我理解,静态导致该变量在函数完成时不会更改其值。但你能再次解释一下为什么我不添加retain,它就不起作用了吗?好的,我扩展了答案的第二部分-这有帮助吗?似乎当函数完成时,字符集被释放了,正如你在charSet中所说的,它是随机垃圾。我想我明白了,是吗?只要自动释放池被排空,就会释放次要的挑剔字符集。这发生在通过事件处理循环的每次行程结束时,不一定是在该方法调用结束时。例如,如果某个东西正在使用Cocoa绑定来观察textField的更改,那么在处理这个event.hmm时也会调用相关的通知方法,但是u说,因为旧对象已被销毁。
 charset =[[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];