FOUND IT! (After 6 hours).
Instead of deleting my question, I left it on in case someone else runs into the same problem.
Problem:
If I create an array with a fixed list of items
theArray = [[NSArray alloc] initWithObjects: @"One", @"Two", nil];
and use that in a picker’s titleForRow routine (standard wording, the only difference being the return statement):
return [theArray objectAtIndex: row];
the picker fills and works fine.
But, if I fill theArray using…
theArray = [[NSArray arrayWithArray: [textString componentsSeparatedByString: @"||"]];
the program bombs with a BAD ACCESS message. I have used NSLog to examine the textString, and a loop to verify that theArray contains the same data as if it were filled directly (including the “nil“) but can’t make the picker accept theArray for its row titles unless the array elements are hardwired in.
SOLUTION, add the word “retain“: I scrapped the arrayWithArrays and went with:
theArray = [[textString componentsSeparatedByString: @"||"] retain];
Apparently, the array you get with componentsSeparatedByString is autoreleased, and doesn’t stay around long enough for the picker to get populated. I’m new in the game, and not very knowledgeable about memory issues, so my explanation might not be 100%. But the program is now working.
From Rob Smythe’s update to the question with the answer: