您可以發送消息給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