Reputation: 6758
I have an NSMutableArray (timeZoneTree) that is loaded using this line
timeZoneTree = [[Timezone getTimeZoneTree] retain];
The definition of Timezone is
@interface Timezone : NSObject
{
NSString *name;
int rawOffset;
}
and the getTimeZoneTree method is the following:
+ (NSMutableArray*) getTimeZoneTree
{
if (offsetGroups == nil)
{
// initialize a new mutable array
offsetGroups = [[[NSMutableArray alloc] init] autorelease];
// build the path to the timezones file
NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"TimeZones.dat"];
// get the data of the file
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
BufferReader *reader = [[BufferReader alloc] initWithBuffer:(const char*)[data bytes] length:[data length]];
OffsetGroup *curOffsetGroup;
RegionGroup *curRegionGroup;
int offsetGroupCount = [reader readInt32];
// go through all raw offset groups
for(int curOffsetGroupIndex=0; curOffsetGroupIndex<offsetGroupCount; ++curOffsetGroupIndex)
{
int rawOffset = [reader readInt32];
// initialize a new offset group
curOffsetGroup = [[OffsetGroup alloc] init];
curOffsetGroup.rawOffset = rawOffset;
// and add it to the offset groups
[offsetGroups addObject:curOffsetGroup];
int regionGroupCount = [reader readInt32];
// go through all region group of the war offset group
for(int curRegionGroupIndex=0; curRegionGroupIndex<regionGroupCount; ++curRegionGroupIndex)
{
int regionNameLength = [reader readInt8];
char *regionNameUTF8 = malloc(regionNameLength + 1);
[reader readBytes:regionNameUTF8 withLength:regionNameLength];
regionNameUTF8[regionNameLength] = '\0';
// initialize a new region group
curRegionGroup = [[RegionGroup alloc] init];
curRegionGroup.name = [NSString stringWithCString:regionNameUTF8 encoding:NSUTF8StringEncoding];
// and add it to the region groups of the offset group
[curOffsetGroup.regionGroups addObject:curRegionGroup];
int timeZoneCount = [reader readInt32];
// go through all time zones
for(int curTimeZoneIndex=0; curTimeZoneIndex<timeZoneCount; ++curTimeZoneIndex)
{
int timeZoneNameLength = [reader readInt8];
char *timeZoneNameUTF8 = malloc(timeZoneNameLength+1);
[reader readBytes:timeZoneNameUTF8 withLength:timeZoneNameLength];
timeZoneNameUTF8[timeZoneNameLength] = '\0';
// create a new time zone name
NSString *timeZoneName = [NSString stringWithCString:timeZoneNameUTF8 encoding:NSUTF8StringEncoding];
// if the name is not nil
if (timeZoneName != nil)
// then add it to the region group
[curRegionGroup.timeZones addObject:timeZoneName];
free(timeZoneNameUTF8);
}
[curRegionGroup release];
free(regionNameUTF8);
}
[curOffsetGroup release];
}
[reader release];
[data release];
}
return offsetGroups;
}
What is the problem? Why the code crashed sometimes on this line? I am building with ROOTSDK 7.0
Upvotes: 0
Views: 90
Reputation: 122381
I'd say it was the use of autorelease
in what appears to be an global variable:
offsetGroups = [[[NSMutableArray alloc] init] autorelease];
// ^^^^^^^^^^^
This means as soon as the thread hits an autorelease pool drain (in the run loop, probably) the array is released.
Remove the use of autorelease
, and if you do this you need to remove the retain
on the first line of code.
Upvotes: 1