On 14 Dec 2009, at 23:01, David Hirsch wrote:

> (After drafting the first version of this email, I found a sort-of solution, 
> but I do not understand why it works.  I thought that simple properties 
> (e.g., object.foo) essentially just called the foo:/setFoo: methods, 
> particularly if you used @property (assign).  That is apparently not the 
> case.  See the code for a working and non-working version.  Note that I do 
> not have custom setters/getters; I've synthesized them.)
> 
> I have a Configuration object that has an NSMutableArray of instances (i.e., 
> the class name is "Instance" - this is not the computer science definition of 
> "instance").  Each Instance has a course, room, instructor (which are, 
> respectively, Course *, Room *, Instructor *).  In the newNearbyConfiguration 
> method of Configuration, I need to make a slightly modified copy of the 
> Configuration object.  To do this, I choose an Instance from the array, 
> modify it (for example, by changing the room to a different Room *).  Oddly, 
> however, when I make this change, the array suddenly gets a new copy of the 
> original Instance.  The new copy has a new memory address.  I would have 
> expected that I can modify the contents of an object in an NSMutableArray 
> without needing to replace the original.
> The Instance * should still point to the same memory, right?
> Also, I put a breakpoint in Instance copyWithZone, but that was apparently 
> not called.
> Can anybody shed light on this?  Here is some relevant code:
> 
> (From Instance.h:)
> @interface Instance : NSObject {
>       Course *                course;         // shallow copy
>       WeekPattern *   pattern;        // shallow copy
>       Instructor *            instructor;     // Shallow copy
>       Timing *                        timing; // Deep copy
>       Room *                  room;   // Shallow copy
>       NSUInteger              quarter; // Simple copy 0=fall, 1=winter, 
> 2=spring
> }
> 
> @property (assign) Course *           course;         // weak reference
> @property (assign) WeekPattern *      pattern;        // weak reference
> @property (assign) Instructor *               instructor;     // weak 
> reference
> @property (assign) Timing *           timing; // strong reference - I own this
> @property (assign) Room *             room;   // weak reference
> @property (assign) NSUInteger quarter;        
> 
> 
> (From Configuration.h:)
> @interface Configuration : NSObject <NSCopying> {
>       NSMutableArray *instances;      // array of Instances
>       ClassSchedulerDoc *myDoc;       // weak reference
> }
> @property (retain) NSMutableArray *instances;
> @property (assign) ClassSchedulerDoc *myDoc;
> 
> (From Configuration.m, highly edited for brevity)
> - (Configuration *) newNearbyConfiguration {
>       // make a new configuration like the current one but with one small 
> change
>       Configuration *newConfig = [self copy];

Great, assuming you've implemented -copyWithZone: properly, you've made a copy 
of the configuration.
>       
>       short randInstance = rand() % [self.instances count];
>       Instance *instanceToAlter = [self.instances objectAtIndex:randInstance];
>       Room *newRoom;
>       do {
>               newRoom = [[instanceToAlter course] randomLowCostRoom];
>       } while (newRoom == [instanceToAlter room]);
>       [instanceToAlter setRoom: newRoom];     // this works
> //    instanceToAlter.room = newRoom; // this displays the problem described 
> above
> 
>       return newConfig;
And as expected, you're returning the new configuration. But, since creating 
it, you've not modified it in any way. I suggest looking at all the calls to 
self within this method and checking whether you actually meant to send them to 
newConfig.
> }
> 
> - (NSString *)description {
>       NSMutableString *desc = [NSMutableString stringWithCapacity:200];
>       
>       for (Instance *thisInstance in instances) {
>               [desc appendString:[thisInstance briefDescription]];
>       }
>       return desc;
> }
> 
> Also, I do know that I could easily have just made Configuration inherit from 
> NSMutableArray.  That would appear to be irrelevant to my question.
> 
> Thanks,
> Dave
> 
> ============================
> Dave Hirsch
> Associate Professor
> Department of Geology
> Western Washington University
> persistent email: [email protected]
> http://www.davehirsch.com
> voice: (360) 389-3583
> aim: [email protected]
> vCard: http://almandine.geol.wwu.edu/~dave/personal/DaveHirsch.vcf
> ============================
> 
> 
> 
> _______________________________________________
> 
> 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:
> http://lists.apple.com/mailman/options/cocoa-dev/cocoadev%40mikeabdullah.net
> 
> This email sent to [email protected]

_______________________________________________

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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to