• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Problem with properties and setters; also:Surprising behavior of NSMutableArray - makes spontaneous copy
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Problem with properties and setters; also:Surprising behavior of NSMutableArray - makes spontaneous copy


  • Subject: Re: Problem with properties and setters; also:Surprising behavior of NSMutableArray - makes spontaneous copy
  • From: Mike Abdullah <email@hidden>
  • Date: Mon, 14 Dec 2009 23:19:26 +0000

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@hidden
> http://www.davehirsch.com
> voice: (360) 389-3583
> aim: email@hidden
> vCard: http://almandine.geol.wwu.edu/~dave/personal/DaveHirsch.vcf
> ============================
>
>
>
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> 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:
>
> This email sent to email@hidden

_______________________________________________

Cocoa-dev mailing list (email@hidden)

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:

This email sent to email@hidden

References: 
 >Problem with properties and setters; also:Surprising behavior of NSMutableArray - makes spontaneous copy (From: David Hirsch <email@hidden>)

  • Prev by Date: Re: Problem with properties and setters; also:Surprising behavior of NSMutableArray - makes spontaneous copy
  • Next by Date: Modifying outside properties from NSOperation subclass
  • Previous by thread: Re: Problem with properties and setters; also:Surprising behavior of NSMutableArray - makes spontaneous copy
  • Next by thread: Modifying outside properties from NSOperation subclass
  • Index(es):
    • Date
    • Thread