您可以发送消息给nil,但不能访问nil的实例变量。你会得到一个EXC_BAD_ACCESS
例外。
考虑一个实例变量的类:
@implementation MyObject {
int instanceVariable;
}
- (id)init {
self = [super init];
instanceVariable = 7;
return self;
}
如果[super init]
回报在这个例子中无会发生什么?您将尝试从空指针访问instanceVariable
,您将得到一个异常。
即使你没有访问任何实例变量,其他的事情可以肯定出问题,如果你不检查self == nil
。你可以很容易地泄漏malloc
-分配的内存或文件句柄,或者将自己传递给一些不期望为零的方法。
其他答案声称,如果你不检查零,你可以泄漏对象。例如:
@implementation MyObject
@synthesize someProperty; // assume it's an NSObject *
- (id)init {
self = [super init];
[self setSomeProperty:[[NSObject alloc] init]];
return self;
}
这不会在ARC下泄漏,即使self
为零。在手动引用计数(MRC),这个例子将泄漏self
是否是零或没有,因为没有什么平衡+1从[NSObject alloc]
保留计数。
正确的方式做到这一点MRC下是这样的:
- (id)init {
self = [super init];
[self setSomeProperty:[[[NSObject alloc] init] autorelease]];
}
或本:
- (id)init {
self = [super init];
NSObject *object = [[NSObject alloc] init];
[self setSomeProperty:object];
[object release];
return self;
}
这些都不会有泄漏,self
是否为零与否。
如果绕过setter方法,这样,你只会崩溃,如果self
是零:
- (id)init {
self = [super init];
_someProperty = [[NSObject alloc] init];
return self;
}
这是相当的信号 - C没有异常。 – 2012-08-17 07:24:09
+1虽然,很好的答案。 – 2012-08-17 07:27:39
这是一个CPU异常,而不是C++异常。查看'/ usr/include/mach/exception_types.h'。 – 2012-08-17 07:29:18