Now that Xcode4 is publicly available I\'m moving this question out of Apple\'s secret dev forum:
Can someone explain why the code generated in the following procedu
Monogenerator doesn't plugin with Xcode 4 so you could use a runscript triggering mogenerators commandline util:
mogenerator -m Resources/CoreData/XcodeProj.xcdatamodeld/XcodeProj1.xcdatamodel --base-class RootManagedObjectClass --template-path Resources/MoGenerator -O Sources/Classes
I use the old XCode 3 way you described in XCode 4 (latest with iOS4.3) and it works as before and what it generates for me is this:
#import <CoreData/CoreData.h>
@class JiraIssueType;
@class JiraPriority;
@class Customer;
@class JiraComment;
@class JiraComponent;
@class JiraUser;
@class Report;
@class Tag;
@interface JiraIssue : NSManagedObject
{
}
@property (nonatomic, retain) NSString * jiraId;
@property (nonatomic, retain) NSString * summary;
@property (nonatomic, retain) NSString * detailedDescription;
@property (nonatomic, retain) NSDate * createdDate;
@property (nonatomic, retain) NSDate * lastUpdatedDate;
@property (nonatomic, retain) NSString * key;
@property (nonatomic, retain) Report * report;
@property (nonatomic, retain) NSSet* comments;
@property (nonatomic, retain) JiraPriority * priority;
@property (nonatomic, retain) NSSet* components;
@property (nonatomic, retain) JiraIssueType * type;
@property (nonatomic, retain) Customer * customer;
@property (nonatomic, retain) NSSet* tags;
@property (nonatomic, retain) JiraUser * assignedTo;
@end
@interface JiraIssue (CoreDataGeneratedAccessors)
- (void)addCommentsObject:(JiraComment *)value;
- (void)removeCommentsObject:(JiraComment *)value;
- (void)addComments:(NSSet *)value;
- (void)removeComments:(NSSet *)value;
- (void)addComponentsObject:(JiraComponent *)value;
- (void)removeComponentsObject:(JiraComponent *)value;
- (void)addComponents:(NSSet *)value;
- (void)removeComponents:(NSSet *)value;
- (void)addTagsObject:(Tag *)value;
- (void)removeTagsObject:(Tag *)value;
- (void)addTags:(NSSet *)value;
- (void)removeTags:(NSSet *)value;
@end
Generating those accessors was really handy, not sure why they've changed that.
I use this snippets as an alternative:
- (void)add<#entity#>sObject:(<#entity#> *)value;
- (void)remove<#entity#>sObject:(<#entity#> *)value;
- (void)add<#entity#>s:(NSSet *)value;
- (void)remove<#entity#>s:(NSSet *)value;
I discovered the same problem a month or so ago and posted about it on the Xcode 4 preview forums at apple. There's been no reply. To get mine working I just grabbed the method signatures from the .m file and created the category in the .h file. Basically hacked the generated code back to how XCode 3 would have done it. I haven't tried with the new release version of Xcode 4.
It looks like all Xcode4 has done is make explicit what the @dynanmic directive makes implicit. The generated code looks exactly like that generated by Xcode3 when you asked it to generate accessors for a particular attribute (to the clipboard.)
I'm not sure why they decided to do it that way. Possibly they thought it would make it easier for people to create custom accessors if they just gave them the full basic accessor.
It shouldn't be that hard for someone to shoehorn MOGenerator into Xcode4. Hint, hint. Anyone? Come on guys! Anyone? Bueller?
Sigh, looks like it me.
Short answer: Don't use Xcode's code generation. Use mogenerator and enjoy an easier life.
As for the why, it is hard to say. I have never been a fan of the way that Xcode generates the Core Data subclasses and would not recommend them. We could guess as to why they did the things they have done but based on other issues with Xcode4 and Core Data I would chalk it up to "not ready" or "not fully tested".
File a radar if you would like to continue to use Xcode code generator.