363 Stimmen

Ausnahme, die in den von NSOrderedSet generierten Accessors ausgelöst wird

In meiner Lion-Anwendung habe ich dieses Datenmodell:

enter image description here

Die Beziehung subitems innerhalb Item ist bestellt .

Xcode 4.1 (Build 4B110) hat für mich die Datei Item.h , Item.m , SubItem.h y SubItem.h .

Hier ist der Inhalt (automatisch generiert) von Item.h :

#import <Foundation/Foundation.h>

#import <CoreData/CoreData.h>

@class SubItem;

@interface Item : NSManagedObject {
@private
}

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSOrderedSet *subitems;
@end

@interface Item (CoreDataGeneratedAccessors)

- (void)insertObject:(SubItem *)value inSubitemsAtIndex:(NSUInteger)idx;
- (void)removeObjectFromSubitemsAtIndex:(NSUInteger)idx;
- (void)insertSubitems:(NSArray *)value atIndexes:(NSIndexSet *)indexes;
- (void)removeSubitemsAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInSubitemsAtIndex:(NSUInteger)idx withObject:(SubItem *)value;
- (void)replaceSubitemsAtIndexes:(NSIndexSet *)indexes withSubitems:(NSArray *)values;
- (void)addSubitemsObject:(SubItem *)value;
- (void)removeSubitemsObject:(SubItem *)value;
- (void)addSubitems:(NSOrderedSet *)values;
- (void)removeSubitems:(NSOrderedSet *)values;

@end

Und hier ist der (selbst erstellte) Inhalt von Item.m :

#import "Item.h"
#import "SubItem.h"

@implementation Item

@dynamic name;
@dynamic subitems;

@end

Wie Sie sehen können, ist die Klasse Item bietet eine Methode namens addSubitemsObject: . Leider, wenn Sie versuchen, es auf diese Weise zu verwenden:

Item *item = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:self.managedObjectContext];
item.name = @"FirstItem";

SubItem *subItem = [NSEntityDescription insertNewObjectForEntityForName:@"SubItem" inManagedObjectContext:self.managedObjectContext];

[item addSubitemsObject:subItem];

dieser Fehler auftreten:

2011-09-12 10:28:45.236 Test[2002:707] *** -[NSSet intersectsSet:]: set argument is not an NSSet

Können Sie mir helfen?

Aktualisierung:

Nach nur 1.787 Tagen seit meiner Fehlermeldung schrieb mir Apple heute (1. August 2016) Folgendes: "Bitte überprüfen Sie dieses Problem mit dem neuesten iOS 10 Beta-Build und aktualisieren Sie Ihren Fehlerbericht unter bugreport.apple.com mit Ihren Ergebnissen." . Hoffen wir, dass dies der richtige Zeitpunkt ist :)

2voto

LevinYan Punkte 56

Ich habe dieses Problem gelöst, indem ich die Umkehrung auf Keine Umkehrung gesetzt habe, ich weiß nicht warum, vielleicht gibt es einen Apple Bug. enter image description here

2voto

lobodart Punkte 216

Ich habe gerade das Problem in Swift (Xcode 6.1.1).

Die Antwort lautete KEINE METHODE ODER ZUSÄTZLICHE DINGE KODIEREN in Ihren NSManagedObject-Unterklassen. Ich denke, es ist ein Fehler des Compilers. Sehr seltsamer Fehler ..

Ich hoffe, es hilft.

2voto

Entropy Punkte 31

Ich glaube, alle übersehen das eigentliche Problem. Es liegt nicht in den Accessor-Methoden, sondern in der Tatsache, dass NSOrderedSet ist nicht eine Unterklasse von NSSet . Wenn also -interSectsSet: mit einer geordneten Menge als Argument aufgerufen wird, schlägt er fehl.

NSOrderedSet* setA = [NSOrderedSet orderedSetWithObjects:@"A",@"B",@"C",nil];
NSSet* setB = [NSSet setWithObjects:@"C",@"D", nil];

 [setB intersectsSet:setA];

scheitert mit *** -[NSSet intersectsSet:]: set argument is not an NSSet

Es sieht so aus, als ob die Lösung darin besteht, die Implementierung der Mengenoperatoren zu ändern, damit sie die Typen transparent behandeln. Es gibt keinen Grund, warum ein -intersectsSet: sollte entweder mit einer geordneten oder ungeordneten Menge funktionieren.

Die Ausnahme geschieht in der Änderungsmeldung. Vermutlich in dem Code, der die umgekehrte Beziehung behandelt. Denn es passiert nur, wenn ich eine inverse Beziehung einstelle.

Bei mir hat das folgende geholfen

@implementation MF_NSOrderedSetFixes

+ (void) fixSetMethods
{
    NSArray* classes = [NSArray arrayWithObjects:@"NSSet", @"NSMutableSet", @"NSOrderedSet", @"NSMutableOrderedSet",nil];

    [classes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSString* name = obj;
        Class aClass = objc_lookUpClass([name UTF8String]);
        [MF_NSOrderedSetFixes fixMethodWithSetArgument:@selector(intersectsSet:) forClass:aClass];
        [MF_NSOrderedSetFixes fixMethodWithSetArgument:@selector(isSubsetOfSet:) forClass:aClass];
    }];
}

typedef BOOL (*BoolNSetIMP)(id _s,SEL sel, NSSet*);

/*
    Works for all methods of type - (BOOL) method:(NSSet*) aSet
*/
+ (void) fixMethodWithSetArgument:(SEL) aSel forClass:(Class) aClass 
{
    /* Check that class actually implements method first */
    /* can't use get_classInstanceMethod() since it checks superclass */
    unsigned int count,i;
    Method method = NULL;
    Method* methods = class_copyMethodList(aClass, &count);
    if(methods) {
        for(i=0;i<count;i++) {
            if(method_getName(methods[i])==aSel) {
                method = methods[i];
            }
        }
        free(methods);
    }
    if(!method) {
        return;
    }

   // Get old implementation
   BoolNSetIMP originalImp  = (BoolNSetIMP) method_getImplementation(method);
   IMP newImp = imp_implementationWithBlock(^BOOL(NSSet *_s, NSSet *otherSet) {
        if([otherSet isKindOfClass:[NSOrderedSet class]]) {
            otherSet = [(NSOrderedSet*)otherSet set];
        }
        // Call original implementation
        return originalImp(_s,aSel,otherSet);
    });
    method_setImplementation(method, newImp);
}
@end

1voto

emreoktem Punkte 2147

Bessere Version der richtigen Antwort in SWIFT

var tempSet = NSMutableOrderedSet()
if parent!.subItems != nil {
    tempSet = NSMutableOrderedSet(orderedSet: parent!.subItems!)
}

tempSet.add(newItem)
parent!.subItems = tempSet

1voto

BenV Punkte 1118

Ich habe diese Frage gefunden, indem ich nach der Fehlermeldung gegoogelt habe, und wollte nur darauf hinweisen, dass ich diesen Fehler auf eine etwas andere Art und Weise (nicht mit geordneten Mengen) erlebt habe. Dies ist nicht ganz eine Antwort auf die gestellte Frage, aber ich poste es hier, falls es für andere hilfreich ist, die bei der Suche über diese Frage stolpern.

Ich fügte eine neue Modellversion hinzu und fügte einige Beziehungen zu bestehenden Modellen hinzu und definierte die add*Object-Methoden in der Kopfdatei selbst. Als ich versuchte, sie aufzurufen, erhielt ich den oben genannten Fehler.

Nachdem ich meine Modelle überprüft hatte, stellte ich fest, dass ich dummerweise vergessen hatte, das Kontrollkästchen "To-Many-Beziehung" zu aktivieren.

Wenn Sie also mit diesem Problem konfrontiert sind und keine geordneten Sets verwenden, überprüfen Sie Ihr Modell.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X