如何释放或禁止类型转换对象?

时间:2009-11-19 04:49:39

标签: iphone cocoa-touch xcode memory-management

我对通过类型转换初始化的对象感到有点困惑。像

UITextField *txtFld = (UITextField *)[self.view viewWithTag:someTag];
//
//
//some code here for this text field usage
//
//

现在,当我完成使用此文本字段时,我应该将其设置为nil或保留它,以便系统处理它。

现在,对于数据库类的对象(使用sqlite),我创建了一个像

这样的对象
DatabaseClass *dbObj = (DatabaseClass *)[[appDelegateObject dbObjArray] objectAtIndex:index];

在完成此对象后,我是否应将其设置为nil

或应初始化对象,如:

DatabaseClass *dbObj = (DatabaseClass *)[[[appDelegateObject dbObjArray] objectAtIndex:index] retain];

然后释放它,最后将其设置为nil。

3 个答案:

答案 0 :(得分:2)

当您输入类似的转换时,没有创建新对象。它只是告诉编译器你应该使用的对象应该被视为在这种情况下是DatabaseClass *

所以在这种情况下,我相信viewWithTag:会返回一个对象,你不需要做任何保留/释放的对象,除非你想把它作为一个ivar保存。

我希望有所帮助。

答案 1 :(得分:2)

这里的转换是无关紧要的,重要的是你如何获得对象的引用。这里有一个很好的SO问题:Understanding reference counting with Cocoa and Objective-C涵盖了保留/发布问题。基本上,在这些情况下你不需要做任何事情,因为你得到的物品并非由你拥有。

答案 2 :(得分:0)

  1. 您不必转换类型。 Objective-C是一种动态语言。 如果这会抛出编译器警告

    ,请更正我
     DatabaseClass = *dbObj = [[appDelegateObject dbObjArray] objectAtIndex:i];
    
  2. 所有方法都应该在Cocoa中返回自动释放的对象。例外:所有复制方法和所有alloc方法。

    因此,不保留/释放它们是因为它们是自动释放的。

  3. nil的设置变量仅对垃圾回收环境有影响。只要你为iPhone编程,这对你来说无关紧要。

    但即使在垃圾收集环境设置中,也不需要变量nil,因为编译器应该能够自动找出不再需要哪些变量。

    这是一个例外。您可以并且有时应该在GC环境中将实例的属性设置为nil