1

我正在学习 iOS 编程,所以请多多包涵。想象一下,我有一个类,我只想有一个简单 init的方法(无参数)和我想通过属性完成的实例变量的初始化。例如:

@interface MyClass : NSObject
{

}
@property (nonatomic) SomeClass1 *p1;
@property (nonatomic) SomeClass2 *p2;
@property (nonatomic) SomeClass3 *p3;

正如我提到的,我有一个简单的init,没有参数。没什么,我什至没有实现它,它是从 NSObject 继承的。所以,现在,如果有人要初始化对象p1,p2,p3的变量MyClass,就不能出现这种问题的情况,当有人设置:

1. MyClass *object = [[MyClass alloc] init];
2. [[object p1] doSomething];

第二行会引发异常,因为object.p1 = [[SomeClass1 alloc] init]它之前没有例如调用?

4

1 回答 1

4

它不会引发异常,因为在 Objective-C 中,对nil对象指针的方法调用是无操作的——没有任何反应。这与 C++ 不同,在 C++ 中调用NULL指针上的实例方法会导致崩溃。

这实际上非常有用,因为这意味着您可以链接方法调用而不必担心中间方法返回nil. 像这样:

[[[[object p1] doSomething] doSomethingElse] doAnotherThing];

如果消息传递nil对象崩溃或引发异常,则必须检查这四个方法调用中的每一个的结果以确保安全。

对于它的价值,一般来说,如果您的对象需要一个有效的值p1才能正常工作或有用,那么将该对象作为方法的参数是有意义的-init

于 2013-07-19T13:56:58.850 回答