• 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
Why does Core Data retain an object when one of that object's attributes is changed?
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Why does Core Data retain an object when one of that object's attributes is changed?


  • Subject: Why does Core Data retain an object when one of that object's attributes is changed?
  • From: Marco Masser <email@hidden>
  • Date: Thu, 14 Aug 2008 20:21:12 +0200

Hi!

I came across a strange problem today:

I have a simple Core Data Application whose managed object model has one entity with one attribute. I set up an AppController class that inserts one instance of that entity's backing class (NSManagedObject) into the MOC:

- (void)awakeFromNib {
myObject = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" inManagedObjectContext: [[NSApp delegate] managedObjectContext]];
}



Then, there is an IBAction that is called every time I press a button in the GUI:


- (IBAction)doIt:(id)sender {

NSLog(@"before: object's retain count: %i", [myObject retainCount]);

// Call the setter of myBoolAttribute. This will change object's retain count
[myObject setValue:[NSNumber numberWithBool:YES] forKey:@"myBoolAttribute"];


NSLog(@"after : objects's retain count: %i\n\n", [myObject retainCount]);
}



The strange thing is that setting the myBoolAttribute increases object's retain count every time. I tried doing a [managedObjectContext setRetainsRegisteredObjects:NO]; in the Xcode template's AppDelegate class, right after the managed object context is created (line 93, the line right after alloc+init), but it just makes the first value printed by the above method start lower by one (as expected).



I did nothing more than the above. No special settings for the entity or the class, nothing. Then, I created an NSManagedObject subclass for testing different, self-implemented setters for myAttribute:


@interface MyEntityClass : NSManagedObject { }
@property(retain, nonatomic) NSNumber *myBoolAttribute;
@end

@implementation MyEntityClass

@dynamic myBoolAttribute;

// 1. Using Core Data's generated setter causes self's retain count to be changed

// 2. Using this setter causes self's retain count to be changed
- (void)setMyBoolAttribute:(NSNumber *)value {
	[self willChangeValueForKey:@"myBoolAttribute"];
	[self setPrimitiveValue:value forKey:@"myBoolAttribute"];
	[self didChangeValueForKey:@"myBoolAttribute"];
}

// 3. Using this setter does not cause self's retain count to be changed - but it's wrong
- (void)setMyBoolAttribute:(NSNumber *)value {
[self setPrimitiveValue:value forKey:@"myBoolAttribute"];
}


// 4. This setter is stupid and should cause a crash later on - but it doesn't
- (void)setMyBoolAttribute:(NSNumber *)value {
[self willChangeValueForKey:@"myBoolAttribute"];
[self setPrimitiveValue:value forKey:@"myBoolAttribute"];
[self didChangeValueForKey:@"myBoolAttribute"];
[self release];
}


@end


After a few NSLog()'s in setter #3 it is clear, that - willChangeValueForKey: increases the retain count. Why does it do that?



After that, I tried adding additional attributes to my entity and to make everything even worse, *all* attributes' retain counts are increased by -willChangeValueForKey:



This is not the first time I'm writing a Core Data application and I just can't see where the problem lies. I was really thinking long and hard about this before I wrote this mail, but it just doesn't make sense to me...


Any comments are greatly appreciated!

Marco
_______________________________________________

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


  • Follow-Ups:
    • Re: Why does Core Data retain an object when one of that object's attributes is changed?
      • From: Ron Lue-Sang <email@hidden>
  • Prev by Date: AddressBook Record (Group/Person) ID: What's the best way to store ID in a NSDictionary?
  • Next by Date: Re: @try @catch
  • Previous by thread: Re: AddressBook Record (Group/Person) ID: What's the best way to store ID in a NSDictionary?
  • Next by thread: Re: Why does Core Data retain an object when one of that object's attributes is changed?
  • Index(es):
    • Date
    • Thread