NSArray @property backed by a NSMutableArray
Saw a bunch of posts today on Stack Overflow asking how to implement this:
NSArray @property backed by a NSMutableArray
Hiding privately mutable properties behind immutable interfaces in Objective-C (my answer)
Protect from adding object to NSMutableArray in public interface
How to expose an NSMutableArray as an NSArray as a return type from a method
The main reason is to expose an array as immutable in the public interface, to convey that it shouldn’t be modified externally, but can be mutated internally. This is a typical thing you would want to do in a Model class, e.g. having an insertObject method and then notifying controllers via a delegate and notifications. One of the stumbling blocks I noticed is people were trying to implement is solely with their knowledge of properties, where you can redefine a readonly property as readwrite internally using a category, unfortunately you cannot change its type. With some understanding of ObjC before automatic synthesis the solution is to manually implement the ivar that backs the property, like this:
.h file:
@interface Model : NSObject @property (nonatomic, strong) NSArray *objects; -(void)insertObject:(id)object // todo: delegate @end
.m file:
@implementation Model{ NSMutableArray* _objects; } -(void)insertObject:(id)object{ if(!_objects){ _objects = [[NSMutableArray alloc] init]; } [_objects addObject:object]; } @end
Just one of the many reasons developers have such a difficulty extracting their model from the view controller in Apple’s default project templates.
0 Comments