I have an NSMutableArray
as a member variable for a class.
In the .h
file:
@interface bleh {
NSMutableArray *list;
}
@property (readonly, assign) NSMutableArray *list;
@end
In the .m
file:
@implementation bleh
@synthesize list;
-(void)init;
{
list = [NSMutableArray arrayWithCapacity:30];
}
@end
Now, I'm not really an objective-C programmer, so maybe I'm missing some of the nuances, but when I do the following:
NSMutableString *listItem = [NSMutableString stringWithString:@"Foobar"];
[list addObject:listItem];
I'm getting strange behavior. Namely, I'm using this to keep a list of files that I eventually want to attach to an email and then open the picker. I'm getting a SIGABRT, and upon debugging, I find out that whenever I operate on list, I'm getting nothing. addObject messages don't increase the size of the NSMutableArray
at all.
Am I missing something? Can someone show me a full implementation of setting up an NSMutableArray
to be manipulated within a class in Objective C?
Thanks.
PS - Assume that I'm smart enough to put the manipulations of the NSMutableArray
inside of a member function for the class containing the member variable.
Problem ehre (assuming you initing your array properly) could be that
@"Foobar"
assings anNSString
not anNSMutableString
so its failing because if distinct types you should door
You're creating the array with
arrayWithCapacity:
, which returns an array you don't own, and you're never claiming ownership over it. Use a property accessor to retain the array:I would recommend reading the Cocoa memory management docs. Once you know the rules in there, it will be clear what to do in this sort of situation. They're not very hard, but they are very necessary if you're going to be programming Cocoa.
Are you initializing your list properly? Ie do you have something like the following in your code?
Your
list
property declaration is keeping you from properly retaining theNSMutableArray
. By callingarrayWithCapacity
you're effectively putting the array in an autorelease pool, which means it could be deallocated at any time if no object interested in keeping it around. While you are, the way you have things declared doesn't reflect that:The above declaration simply sets this pointer to be a copy of another pointer - it does no memory management for you. Instead it should read:
... and you should assign the list like so:
Because you specify the
retain
attribute for the property, whenever it is assigned a new value theretain
message will be sent to that new value, communicating to the memory manager that you don't want this object deallocated. In order to bring this full circle, you'll need torelease
the object when you containing class is deallocated:It doesn't look as though you've actually initialized the
NSMutableArray
.In the init event of the object, just say
(I would just say init, but I don't remember if that works. It doesn't matter what capacity you start with)
Before actually allocating the array, the variable "list" will have a value of nil.
in the latest release of the SDK arrayWithCapacity is bad practice. but in your code you creating a array that no one is owner , clam your array properly.
don't forget initialize your array
NSMutableArray *array = [[NSMutableArray alloc] init];
fix the (readonly,assign),