BNRItemStore
is a singleton, and I was confused on why super allocWithZone:
must be called instead of plain old super alloc
. And then override alloc
instead of allocWithZone
.
#import "BNRItemStore.h"
@implementation BNRItemStore
+(BNRItemStore *)sharedStore {
static BNRItemStore *sharedStore = nil;
if (!sharedStore)
sharedStore = [[super allocWithZone: nil] init];
return sharedStore;
}
+(id)allocWithZone:(NSZone *)zone {
return [self sharedStore];
}
@end
From Apple's documentation:
[super alloc]
will call through toallocWithZone:
, which you've overridden to do something else. In order to actually get the superclass's implementation ofallocWithZone:
(which is what you want there) rather than the overridden version, you must sendallocWithZone:
explicitly.The
super
keyword represents the same object asself
; it just tells the method dispatch mechanism to start looking for the corresponding method in the superclass rather than the current class.Thus,
[super alloc]
would go up to the superclass, and get the implementation there, which looks something like:Here,
self
still represents your custom class, and thus, your overriddenallocWithZone:
is run, which will send your program into an infinite loop.