Since listing is an instance variable, you need to "own" a reference to it. [NSArray arrayWithObject:obj] returns an autoreleased array, so by the time the next user event happens, it has been freed. The errors you're seeing happen when you try to send messages to a freed object.
Either add a -retain call ([[NSArray arrayWithObject:obj] retain]), or use the alloc/init version, which has an implicit retain ([[NSArray alloc] initWithObject:obj]).
You'll probably also find it easier to use an NSMutableArray. If contents is an NSMutableString, you can just append the string to it as well...
- (BOOL)application

NSApplication *)theApplication openFile

NSString *)filename
{
[self addToArray:filename];
}
- (void)addToArray

NSString *)filename
{
if (listing == nil)
listing = [[NSMutableArray alloc] initWithObject:filename];
else[listing addObject:filename];
}
...and trying to extract data later:
for (county=1; county <[listing count]; county++)
{
// Assuming contents is an NSMutableString here
// also, you're starting at index 1, this will skip the
// first entry in the listing array here (which is index 0).
[contents appendString:[listing objectAtIndex:county]]];
}