On Jul 10, 2012, at 23:51 , Rick Mann wrote:

> It still bugs me, in the sense that publishing an NSArray* property seems to 
> create a (conceptual) contract that while the property may change, that is, a 
> different NSArray may get assigned to it, the contents of a given NSArray 
> won't change. From what you've both said, this is clearly not the case. But 
> it just smells a little funny.

No, your thinking is incorrect, in the sense that you're somewhat confusing the 
backing storage (i.e. instance variable and hence array pointer value) with the 
property value. It's perfectly fine, for example, for a class to implement an 
indexed to-many property like this (ignoring the proxy/mutability issues we 
were discussing before):

        @implementation MyClass {
                NSMutableArray* _arrayIvar;
        }

        - (NSArray*) myProperty {
                return _arrayIvar;
        }

        - (void) setMyProperty: (NSArray*) newObjects {
                [_arrayIvar removeAllObjects];
                [_arrayIvar addObjectsFromArray: newObjects];
        }

In that case, the returned array pointer is always the same. (The above code is 
KVO-compliant, BTW.)

Because it's a to-many property, there's no API promise regarding the pointer 
value returned by the getter. It just has to be a NSArray-like object that 
provides access to the objects "in" the relationship. There's also no inherent 
API promise saying whether the returned NSArray is a snapshot at a moment in 
time, or an object that reflects the current contents. If it matters, you have 
to settle the behavior by what you're returning. (In the above example, the 
difference would be exemplified by returning '[_arrayIvar copy]' vs. just 
'_arrayIvar'.)

> One last question: What if the underlying data structure isn't an array at 
> all, but rather a dictionary? It's not possible to insert into it at a 
> particular index. Although that wouldn't prevent me from implementing the 
> methods, it seems it would break, because the OS (and clients) would assume 
> remove and insert are paired, and guaranteed to work on the same index (that 
> is, insert followed by remove should result in an unchanged array).

One way is to create a supplementary array data structure that lists the 
dictionary key values in the order that's correct for the array indexes. You 
maintain both data structures in your custom insert/remove/replace KVC 
accessors, as well as in methods that insert/remove dictionary entries for 
other reasons.





_______________________________________________

Cocoa-dev mailing list ([email protected])

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to