• 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: David Hirsch <email@hidden>
  • Date: Mon, 14 Dec 2009 15:08:59 -0800

Sorry - found the primary problem. Should have been this line:
Instance *instanceToAlter = [newConfig.instances objectAtIndex:randInstance];


instead of:
Instance *instanceToAlter = [self.instances objectAtIndex:randInstance];


However, I'm still mystified by the manifestation of the error.
-Dave


On Dec 14, 2009, at 3:01 PM, 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];

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;
}

- (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


============================
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


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

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