I\'m attempting to understand Cocoa\'s Key-Value Coding (KVC) mechanism a little better. I\'ve read Apple\'s Key-Value Programming Guide but am still a little confused abou
The NSMutableArray
you get back from calling mutableArrayValueForKey:
is actually a private subclass of NSMutableArray
which overrides normal array methods such as -count
, -objectAtIndex:
, -insertObject:atIndex:
, etc. and calls the corresponding KVC methods on the object the array was retrieved from. It basically acts as a proxy for manipulating the to-many relationship of the object, and it's not something you have to worry about creating or returning yourself. A quick example of usage:
Playlist* aPlaylist;
Track* aTrack;
NSMutableArray* mutableTracks = [aPlaylist mutableArrayValueForKey:@"tracks"];
[mutableTracks insertObject:aTrack atIndex:0];
This piece of code adds a track to the beginning of the playlist. If the Playlist class implements KVC methods for its "tracks" relationship, then calling a method on the mutable array will result in the appropriate method being called on the underlying object. So in this example, when you call insertObject:atIndex:
on the array, the array will in turn call insertObjectInTracks:atIndex:
on the playlist object, and the track gets added to the playlist's array of tracks.
Now, in this example, of course you could just call insertObjectInTracks:atIndex:
directly, but there are several advantages you can get out of using mutableArrayValueForKey:
instead.
-tracks
and -setTracks:
, and the code above will still work. In this case, instead of calling insertObjectInTracks:atIndex:
, the mutable array proxy will create a new array with the object inserted at the beginning, and then just call setTracks:
on the Playlist object. This is obviously less efficient, so implementing the full list of KVC methods is usually recommended.mutableArrayValueForKey:
allows you to manipulate the relationship without having to know the exact names of the methods you have to call. As long as the object is KVC compliant for the key you're using, everything will "just work".NSMutableArray
itself implements, so for example you could use methods that search the array for objects, sort the array, etc. without having to rewrite special versions to deal with the KVC stuff.