I have following code
NSArray *myArray = [[NSArray alloc] initWithObjects:@"1",@"2",nil];
NSMutableDictionary *dic0 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"parag", @"name", myArray, @"arraye",nil];
NSMutableDictionary *dic1 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"parag1", @"name", myArray, @"arrayr",nil];
NSMutableDictionary *dic2 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"parag2", @"name", myArray, @"arrayq",nil];
NSMutableDictionary *dic3 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"parag2", @"name", myArray, @"arrayqe",nil];
NSArray *array12424 = [[NSArray alloc] initWithObjects:dic0, dic1, dic2, dic3];
NSLog(@"array12424 %d", [array12424 retainCount]);
NSLog(@"array12424 %@", array12424);
int j = [myArray retainCount];
for(int i=0;i<j; ++i)
{
[myArray release];
NSLog(@"%d", i);
NSLog(@"myArray %@", myArray);
}
NSLog(@"array12424 %@", array12424);
After releasing myArray,i expected crash; why arraye and other array key are pointing to array12424?
//output
2012-02-02 12:33:58.454 212121212[6924:a0f] array12424 1
2012-02-02 12:33:58.459 212121212[6924:a0f] array12424 (
{
arraye = (
1,
2
);
name = parag;
},
{
arrayr = (
1,
2
);
name = parag1;
},
{
arrayq = (
1,
2
);
name = parag2;
},
{
arrayqe = (
1,
2
);
name = parag2;
}
)
2012-02-02 12:33:58.459 212121212[6924:a0f] 0
2012-02-02 12:33:58.460 212121212[6924:a0f] myArray (
1,
2
)
2012-02-02 12:33:58.460 212121212[6924:a0f] 1
2012-02-02 12:33:58.460 212121212[6924:a0f] myArray (
1,
2
)
2012-02-02 12:33:58.461 212121212[6924:a0f] 2
2012-02-02 12:33:58.462 212121212[6924:a0f] myArray (
1,
2
)
2012-02-02 12:33:58.463 212121212[6924:a0f] 3
2012-02-02 12:33:58.463 212121212[6924:a0f] myArray (
1,
2
)
2012-02-02 12:33:58.464 212121212[6924:a0f] 4
2012-02-02 12:33:58.466 212121212[6924:a0f] myArray myArray
2012-02-02 12:33:58.466 212121212[6924:a0f] array12424 (
{
arraye = "array12424 ";
name = parag;
},
{
arrayr = "array12424 ";
name = parag1;
},
{
arrayq = "array12424 ";
name = parag2;
},
{
arrayqe = "array12424 ";
name = parag2;
}
)
I am using MAC osx 10.6 base SDK.
0) Do not use
retainCount.1) Cocoa Collections retain their contents, then release them when they are removed, or when the collection is destroyed. Furthermore there’s no documentation which explicitly states the APIs you call through will not autorelease their arguments.
2) You don’t initialize your array correctly — it must be nil terminated:
NSArray *array12424 = [[NSArray alloc] initWithObjects:dic0, dic1, dic2, dic3];3) Simply put, it does not matter — It’s Undefined Behavior. The result cannot be predicted (unless it involves raptors). It crashes in other OS versions. It crashes as you’d expect with GuardMalloc enabled. It crashes shortly afterwards (provided you’re lucky).