I’m sure this is an complete Noob question… but I’ve actually never had to deal with this scenario before so I’m a bit befuddled…
Let’s say I have a custom object I’ll call person, and each person object can have an array of “possessions”, a kind of inventory if you will. I would set it up like this:
interface person : NSObject {
NSString *name;
NSMutableArray *posessions;
@property (copy) NSString *name;
@property (copy) NSMutableArray *posessions; // no idea if this is even necessary...
}
Of course, I would also synthesize my properties in the implementation file… Now, in my actual controller object, I would make an instance of my object (or usually an array of instances, but for this example, one will work fine…) as so:
person *aPerson;
I know that to access the persons name, I could make a call like this:
[aPerson setName:@"Bob"];
and to retrieve that name, I might use this:
aVar = [aPerson name];
What I’m stuck on is how exactly would I go about adding or retrieving objects to the NSMutableArray located inside my person class? Let’s say I want to use the “count” method for the NSMutable Array.
I’ve done some trial and error with attempts such as:
[aPerson.posessions count];
[[aPerson posessions] count];
Likewise, to add an object to an array, I have often used:
[someArray addObject:anObject];
but attempts like this haven’t worked:
[aPerson.posessions addObject:anObject];
After reading up a bunch and searching the web, I can’t seem to find exactly how to interact with this NSMutableArray in my custom class. I’m sure it’s something obvious that I’m just not quite getting, and it’s become a sort of mental block…
Also, am I correct in synthesizing accessor properties for the NSMutableArray? If so, setX and X don’t seem to be quite so obvious with NSMutableArray… unless they simply copy the entire array into a local variable…
Perhaps is this what needs to be done? use the accessor methods to get the entire array, place it in a local variable, make my changes, then use the set accessor method to put the entire array back into my person object?
Can someone enlighten me a bit on the syntax I should be using here?
* EDIT *
I thought I’d add a bit of clarification to this question. My custom objects (in the above example, my person object) are basically database records. I have several databases I am working with in my project, so for example:
Person – a custom sub-class of NSObject containing multiple NSString Objects, as well as Ints and BOOLs.
personDatabase – An Array of Person objects (set up and controlled within my main CONTROLLER object)
All of the set and get methods are called from “Controller”.
What I have been attempting to do is to directly access the individual objects contained within the personDatabase from within my Controller object. I have done this by declaring another object this way:
Person *activePerson;
Then, all of my calls are made to the currently active Person record (the one currently selected from the personDatabase), such as:
someOutput = [activePerson name];
etc.
Is there a way to directly access the objects inside the NSMutableArray object inside the activePerson object from my Controller object?
You’ve specified the ‘possessions’ property as ‘copy’. Therefore, when you write
aPerson.possessionsyou are getting a copy of the possessions array. The call to addObject adds anObject to a new array that is a copy of aPerson’s array of possessions. The simplest ‘fix’ would be to change ‘copy’ to ‘retain’ (and probably ‘readonly’). [Edit: Wrong; it is ‘copy on assign’ – not ‘copy on read’]However, there is a bigger issues. A person has possessions but how you store them is an implementation detail. When you put NSMutableArray in the public interface you overly restrict your implementation. You might be better served to change the Person interface along the lines of:
Then, how you implement these possession methods depends on if you use an array, a set, a linked-list, a tree, a whatever.