Sie können eine Nachricht an nil senden, aber Sie können nicht auf die Instanzvariablen von nil zugreifen. Sie erhalten eine EXC_BAD_ACCESS
Ausnahme.
Betrachten wir eine Klasse, die Instanzvariablen hat:
@implementation MyObject {
int instanceVariable;
}
- (id)init {
self = [super init];
instanceVariable = 7;
return self;
}
Was passiert, wenn [super init]
kehrt in diesem Beispiel gleich null? Sie werden versuchen, auf instanceVariable
von einem Nullzeiger zuzugreifen, und Sie werden eine Ausnahme erhalten.
Auch wenn Sie nicht auf Instanzvariable zugreifen, können andere Dinge sicherlich schief gehen, wenn Sie nicht nach self == nil
suchen. Sie können leicht malloc
-allokierte Speicher- oder Dateizugriffsnummern auslassen oder sich an eine Methode übergeben, die keine NULL erwartet.
Andere Antworten behaupten, dass Sie Objekte verlieren können, wenn Sie nicht nach Null suchen. Zum Beispiel:
@implementation MyObject
@synthesize someProperty; // assume it's an NSObject *
- (id)init {
self = [super init];
[self setSomeProperty:[[NSObject alloc] init]];
return self;
}
Dies wird nicht unter ARC auslaufen, auch wenn self
Null ist. Bei der manuellen Referenzzählung (MRC) wird dieses Beispiel leak, unabhängig davon, ob self
Null ist oder nicht, da es keinen Wert gibt, der die +1 Retain-Anzahl von [NSObject alloc]
ausgleichen soll.
Der richtige Weg, es unter MRC zu tun, ist dies:
- (id)init {
self = [super init];
[self setSomeProperty:[[[NSObject alloc] init] autorelease]];
}
oder dies:
- (id)init {
self = [super init];
NSObject *object = [[NSObject alloc] init];
[self setSomeProperty:object];
[object release];
return self;
}
Keiner von denen, leckt, ob self
Null ist oder nicht.
Wenn Sie die Setter-Methode umgehen, wie diese, werden Sie nur abstürzen, wenn self
nil ist:
- (id)init {
self = [super init];
_someProperty = [[NSObject alloc] init];
return self;
}
Es ist eher ein Signal - C hat keine Ausnahmen. –
+1 obwohl, große Antwort. –
Es ist eine CPU-Ausnahme, keine C++ - Ausnahme. Schau dir '/ usr/include/mach/exception_types.h' an. –