You describe a BAD_ACCESS problem in some of your other comments. There is something else going on here. In ARC, your ivars are strong unless otherwise qualified (and in non-ARC, they're not going to get released on your behalf).
For example, this ARC code works fine, with no BAD_ACCESS as you report in your comments to other answers:
@interface ArcTestViewController ()
{
NSMutableArray *_someArray;
}
@end
@implementation ArcTestViewController
- (void)dealloc
{
_someArray = nil;
}
- (void)viewDidLoad
{
[super viewDidLoad];
_someArray = [[NSMutableArray alloc] initWithObjects:@"Mo", @"Larry", @"Curly", nil];
}
- (IBAction)checkIvarTouchUpInside:(id)sender
{
NSLog(@"%s _someArray = %@", __FUNCTION__, _someArray);
}
@end
You might have to show us your example where you're getting your BAD_ACCESS because it has to be something else.
In answer to the "property" or "ivar" question, while I'm sympathetic to the "always use properties" argument, personally I use properties for anything for which I need to provide external accessors and I otherwise use private ivars (not in the .h, but rather in the private interface in the .m file). This makes my public interfaces in my .h files really clean and easy to understand when I return to them months later. If you do adopt a "always use properties" approach, I'd only advise that your public declaration of those properties should be as restrictive as possible (make the property private if you can, make the public declaration of the property readonly if you don't need to provide readwrite access, etc.).
By the way, the Naming Properties and Data Types of the Coding Guidelines for Cocoa is a good reference of best practices.