将nil对象传递给函数

时间:2010-08-04 22:57:46

标签: iphone objective-c xcode

我想知道在调用函数之前,目标C是否会检查指向对象的指针是否为nil。

例如,假设我有一个

myObject* ptr;

并初始化

ptr = nil;

并致电

[self myFunction:ptr];

其中myFunction是我自己的函数,并且不检查对象是否为nil。我听说某个目标C不会调用该函数,如果它是零的话?这是真的,我的代码会安全吗?

我问的原因是因为我正在实现一个通用应用程序,并且有一个仅适用于ipad的UIView实例。但是,我为这个视图做了很多函数调用,而不是在调用函数之前进行条件检查以查看它是否是ipad,如果我将视图设置为nil,如果它是iphone的话,那就太好了。

另外,如果接口构建器分配了对象并且我将指针设置为nil,是否会出现内存泄漏,或者构建器是否知道dealloc对象?

由于

2 个答案:

答案 0 :(得分:6)

您始终可以提供带nil参数的方法,但我认为您可能误解的是有关消息nil的信息。

MyClass *object = nil;
[object doSomething]; // nothing done, because object is nil

object = [[MyClass alloc] init];
[object doSomething]; // does something, because object points to an instance

演示提供nil作为参数:

NSMutableDictionary *myDict = [NSMutableDictionary dictionary];
[myDict setObject:@"Value 1" forKey:@"Key 1"];
[myDict setObject:nil forKey:@"Key 1"]; // perfectly valid
// myDict is empty again after setting nil value for "Key 1".

myDict = nil;
[myDict setObject:@"Value 1" forKey:@"Key 1"]; // nothing happens!

在上述情况中,objectmyDict被称为“接收者”。当接收方为nil时,不执行任何操作。这与其他编程语言完全不同,例如,在C ++中,以下内容无效:

MyClass *object = NULL;
object->doSomething(); // oops, this is not allowed

答案 1 :(得分:0)

至于内存,如果您在NIB文件中有对象,然后在代码中将其出口设置为nil,则会出现内存泄漏。您应该释放该对象,然后将其设置为nil。

但是,在这种情况下,如果它是iPad,只需创建对象,如果它是iPhone,则将变量保留为nil,这可能是一个好主意。这样,如果在NIB文件中创建对象,则不必处理可能出现的任何杂散引用。这可能是也可能不是问题,但最好是有条件地创造而不是有条件地破坏。