NSArray declares a private ivar _used , which appears to contain an array counter. Using object_getInstanceVariable() , you can verify that in the case of a particular subclass of __NSArrayM this variable increases and decreases when objects are added and deleted.
I used the following command line tool for the Mac OS X Foundation to verify this:
#import <Foundation/Foundation.h> #import <objc/runtime.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSMutableArray *anArray = [NSMutableArray array]; NSLog(@"anArray concrete class is %@", [anArray class]); UInt64 used = 0; for (NSString *toAdd in @[@"o", @"m", @"g"]) { object_getInstanceVariable(anArray, "_used", (void **)&used); NSLog(@"array = %@, used = %lld", anArray, used); [anArray addObject:toAdd]; } for (NSString *toRemove in [anArray copy]) { object_getInstanceVariable(anArray, "_used", (void **)&used); NSLog(@"array = %@, used = %lld", anArray, used); [anArray removeObject:toRemove]; } object_getInstanceVariable(anArray, "_used", (void **)&used); NSLog(@"array = %@, used = %lld", anArray, used); } return 0; }
This program produced the following output:
2013-01-31 17:40:15.376 Array[10173:303] anArray concrete class is __NSArrayM 2013-01-31 17:40:15.378 Array[10173:303] array = ( ), used = 0 2013-01-31 17:40:15.378 Array[10173:303] array = ( o ), used = 1 2013-01-31 17:40:15.379 Array[10173:303] array = ( o, m ), used = 2 2013-01-31 17:40:15.379 Array[10173:303] array = ( o, m, g ), used = 3 2013-01-31 17:40:15.380 Array[10173:303] array = ( m, g ), used = 2 2013-01-31 17:40:15.380 Array[10173:303] array = ( g ), used = 1 2013-01-31 17:40:15.380 Array[10173:303] array = ( ), used = 0