Overriding version of allocWithZone bypassed


#1

On pg 194-[quote]…a knowledgeable programmer could still create an instance of BNRItemStore via allocWithZone:, which would bypass our sneaky alloc trap.To prevent this possibility, override allocWithZone: in BNRItemStore.m to return the single BNRItemStore instance.
+(id) allocWithZone:(NSZone *)zone
{
return [self sharedStore];
}
[/quote]

This statement seems confusing to me. Doesn’t this following code not prove this wrong in a way-

[code] #import <Foundation/Foundation.h>

@interface BNRItemStore : NSObject
	+(BNRItemStore *)sharedStore;
	+(id)retrieveObject;
@end
@implementation BNRItemStore
+(BNRItemStore *)sharedStore{
    static BNRItemStore *sharedStore=nil;
	if (!sharedStore){
		NSLog(@"Test2");
		sharedStore= [[super allocWithZone:nil] init];  
	}      
	NSLog(@"sharedStore-> %@",sharedStore);
  return sharedStore;
}
+(id)allocWithZone:(NSZone *)zone{
	NSLog(@"Test1");
	return [self sharedStore];
}
+(id)alloc{
	NSLog(@"Retrieving super object");
	NSLog(@"%@", [super allocWithZone:nil]);//Bypassing the subclass version of allocWithZone.
	return [super allocWithZone:nil];
	}
@end

int main(){		
	[[BNRItemStore alloc] init]; //the alloc message triggers a call to the subclass (overriding) version of +(id)alloc method		
}[/code]

The output is:
2013-10-18 18:24:40.132 BNRItemStore[381:707] Retrieving super object
2013-10-18 18:24:40.134 BNRItemStore[381:707] <BNRItemStore: 0x7f8c72c091e0>

If the call [super allocWithZone:nil] inside of subclass ‘alloc’ method would have triggered a call to subclass allocWithZone,the console would be logging “Test1” and “Test2” and finally would lead to static pointer getting allocated. But this did not happen.
This means that if we directly call [NSObject allocWithZone:nil] or [super allocWithZone:nil], the message would not redirect to the overriding version (subclass version) of allocWithZone but will give direct access to NSAllocateObject() function which does the actual allocation.
The code of +(id)allocWithZone in NSObject must look somewhat like this-

+(id)allocWithZone:(NSZone *)zone{
  return NSAllocateObject();
}

Had this implementation(NSObject’s allocWithZone:) included something like [self allocWithZone], the message dispatch mechanism would have included the subclass version of allocWithZone which would then make us go through the “sneaky” trap involving a call to sharedStore method.
So can someone clear up this query about this so called “sneaky” trap. Was the trap meant for blocking anyone from instantiating separately .i.e not being able to use NSObject’s allocWithZone except when inside of sharedStore method ? Pls clarify…