2009-08-21 5 views
0

Я создаю свое приложение после добавления некоторого кода, но получаю Секундомер без повторной отправки, отправленный на экземпляр. Ошибка при остановке моего приложения. Вот Изображение Ошибка -Непризнанный селектор отправлен на ошибку экземпляра

alt text http://www.grabup.com/uploads/20f66eecee4bd96198c7bbcfe647ec74.png?direct

Это код, который я добавил (это для источника данных с NSOutlineView)

- (id)init 
{ 
    self = [super init]; 
    if (self != nil) { 
     // initialization code, rootsObjects is a NSArray instance variable 
     rootObjects = [NSArray arrayWithObjects:@"Joshua", @"Erne", nil]; 
    } 
    return self; 
} 

// here NSOutlineView asks how many children rows to display for a given item 
- (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item 
{ 
    // if item is nil this should be a Root row, else I pass 0 for example but should be the count of objects contained in item 
    return (item == nil) ? [rootObjects count] : 0; 
} 

// here NSOutlineView asks if a given item can be expanded i.e contains children 
- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item 
{ 
    // again I return YES for example, but should be based on the count of objects contained in item 
    return YES; //(item == nil) ? YES : ([item numberOfChildren] != -1); 
} 

// here NSOutlineView asks for the object (some treelike structure) assigned to the nth index child row of item 
- (id)outlineView:(NSOutlineView *)outlineView 
      child:(int)index 
      ofItem:(id)item 
{ 
    // if item is nil I opass the appropriate Root row, else I pass nil for example but should be an object contained in item 
    return (item == nil) ? [rootObjects objectAtIndex:index] : nil; 
} 

// here NSOutlineView asks for the objectValue (usually a NSString)) to be displayed in tableColumn for the given item 
- (id)outlineView:(NSOutlineView *)outlineView 
objectValueForTableColumn:(NSTableColumn *)tableColumn 
      byItem:(id)item 
{ 
    // pass the object we want to display in the tableColumn for item 
    return item ; 
    // here I pass item for example since I know it's a NSString, but usually will be something to compute. 
    // the [tableColumn identifier] property (that can be set in Interface Builder) is very useful here. 
} 

// here NSOutlineView asks for the NSCell to be used by tableColumn for the given item 
- (NSCell *)outlineView:(NSOutlineView *)ov 
dataCellForTableColumn:(NSTableColumn *)tableColumn 
        item:(id)item 
{ 
    // the nil tableColumn represents the unified root row style 
    if (tableColumn == nil) { 
     // pass a cell we want to be used as root row (assume we've have assigned "Name" as identifier of some tableColumn) 
     return [[treeTable tableColumnWithIdentifier:@"Name"] dataCell]; 
    } 
    // else just pass the default cell 
    return [tableColumn dataCellForRow:[treeTable rowForItem:item]]; 
} 

- (BOOL)outlineView:(NSOutlineView *)outlineView isGroupItem:(id)item { 
    return YES; 
} 

Вот код, у меня есть в том же файле (Datasource) в качестве кода выше.

- (void)awakeFromNib { 

    dragType = [NSArray arrayWithObjects: @"factorialDragType", nil]; 

    [ dragType retain ]; 

    [ treeTable registerForDraggedTypes:dragType ]; 
    NSSortDescriptor* sortDesc = [[NSSortDescriptor alloc] initWithKey:@"position" ascending:YES]; 
    [groupTreeControl setSortDescriptors:[NSArray arrayWithObject: sortDesc]]; 
    [ sortDesc release ]; 
} 


//------------------------------------ 
#pragma mark NSOutlineView datasource methods -- see NSOutlineViewDataSource 
//--------------------------------------------------------------------------- 
- (BOOL) outlineView : (NSOutlineView *) outlineView 
      writeItems : (NSArray*) items 
     toPasteboard : (NSPasteboard*) pboard { 

    [ pboard declareTypes:dragType owner:self ];   
    // items is an array of _NSArrayControllerTreeNode see http://theocacao.com/document.page/130 for more info 
    draggedNode = [ items objectAtIndex:0 ]; 

    return YES; 
} 




- (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id <NSDraggingInfo>)info item:(id)item childIndex:(int)index { 

    _NSArrayControllerTreeNode* parentNode = item; 
    _NSArrayControllerTreeNode* siblingNode; 
    _NSControllerTreeProxy* proxy = [ groupTreeControl arrangedObjects ]; 

    NSManagedObject* draggedGroup = [ draggedNode observedObject ]; 

    BOOL draggingDown = NO; 
    BOOL isRootLevelDrag = NO; 

    // ---------------------- 
    // Setup comparison paths 
    // ------------------------- 
    NSIndexPath* draggedPath = [ draggedNode indexPath ]; 
    NSIndexPath* siblingPath = [ NSIndexPath indexPathWithIndex: index ]; 
    if (parentNode == NULL) {  
     isRootLevelDrag = YES; 
    } else { 
     // A non-root drag - the index value is relative to this parent's children 
     siblingPath = [ [ parentNode indexPath ] indexPathByAddingIndex: index ]; 
    } 

    // ---------------------- 
    // Compare paths - modify sibling path for down drags, exit for redundant drags 
    // -----------------------------------------------------------------------------  
    switch ([ draggedPath compare:siblingPath]) { 
     case NSOrderedAscending: // reset path for down dragging 
      if (isRootLevelDrag) { 
       siblingPath = [ NSIndexPath indexPathWithIndex: index - 1];        
      } else { 
       siblingPath = [ [ parentNode indexPath ] indexPathByAddingIndex: index - 1 ]; 
      } 
      draggingDown = YES; 
      break; 

     case NSOrderedSame: 
      return NO; 
      break;    
    } 

    siblingNode = [ proxy nodeAtIndexPath:siblingPath ];  

    // NSLog(@"returning early"); 
    // return NO; // TODO robustify 


    // ------------------------------------------------------------ 
    // SPECIAL CASE: Dragging to the bottom 
    // ------------------------------------------------------------ 
    // - K        - K       - C        - C 
    // - - U        - - C  OR  - U        - F 
    // - - C  ====>  - - F     - F        - K 
    // - - F    - U    - K        - U 
    // ------------------------------------------------------------ 
    if (isRootLevelDrag && siblingNode == NULL) {   
     draggingDown = YES; 
     siblingPath = [ NSIndexPath indexPathWithIndex: [ proxy count ] - 1 ];   
     siblingNode = [ proxy nodeAtIndexPath:siblingPath ] ; 
    } 

    // ------------------------------------------------------------ 
    // Give the dragged item a position relative to it's new sibling 
    // ------------------------------------------------------------ 
    NSManagedObject* sibling = [ siblingNode observedObject ]; 
    NSNumber* bystanderPosition = [ sibling valueForKey:@"position"]; 
    int newPos = (draggingDown ? [ bystanderPosition intValue ] + 1 : [ bystanderPosition intValue ] - 1); 
    [draggedGroup setValue:[ NSNumber numberWithInt:newPos ] forKey:@"position"]; 

    // ---------------------------------------------------------------------------------------------- 
    // Set the new parent for the dragged item, resort the position attributes and refresh the tree 
    // ----------------------------------------------------------------------------------------------  
    [ draggedGroup setValue:[ parentNode observedObject ] forKey:@"parent" ]; 
    [ self resortGroups:[draggedGroup managedObjectContext] forParent:[ parentNode observedObject ] ];   
    [ groupTreeControl rearrangeObjects ]; 
    return YES;    
} 






- (NSArray*) getSubGroups:(NSManagedObjectContext*)objectContext forParent:(NSManagedObject*)parent { 
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"projects" inManagedObjectContext:objectContext]; 

    [request setEntity:entity]; 
    NSSortDescriptor* aSortDesc = [[NSSortDescriptor alloc] initWithKey:@"position" ascending:YES]; 
    [request setSortDescriptors:[NSArray arrayWithObject: aSortDesc] ]; 
    [aSortDesc release]; 

    NSPredicate* validationPredicate = [NSPredicate predicateWithFormat:@"parent == %@", parent ]; 

    [ request setPredicate:validationPredicate ]; 

    NSError *error = nil; // TODO - check the error bozo 
    return [objectContext executeFetchRequest:request error:&error];  
} 




- (void) resortGroups:(NSManagedObjectContext*)objectContext forParent:(NSManagedObject*)parent { 

    NSArray *array = [ self getSubGroups:objectContext forParent:parent ]; 

    // Reset the indexes... 
    NSEnumerator *enumerator = [array objectEnumerator]; 
    NSManagedObject* anObject; 
    int index = 0; 
    while (anObject = [enumerator nextObject]) { 
     // Multiply index by 10 to make dragging code easier to implement ;) .... 
     [anObject setValue:[ NSNumber numberWithInt:(index * INTERVAL) ] forKey:@"position"];  
     index++; 
    } 


} 

- (NSDragOperation)outlineView:(NSOutlineView *)outlineView validateDrop:(id <NSDraggingInfo>)info proposedItem:(id)item proposedChildIndex:(int)index { 

    _NSArrayControllerTreeNode* newParent = item; 

    // drags to the root are always acceptable 
    if (newParent == NULL) { 
     return NSDragOperationGeneric; 
    } 

    // Verify that we are not dragging a parent to one of it's ancestors 
    // causes a parent loop where a group of nodes point to each other and disappear 
    // from the control 
    NSManagedObject* dragged = [ draggedNode observedObject ];  
    NSManagedObject* newP = [ newParent observedObject ]; 

    if ([ self category:dragged isSubCategoryOf:newP ]) { 
     return NO; 
    }  

    return NSDragOperationGeneric; 
} 

- (BOOL) category:(NSManagedObject*)cat isSubCategoryOf:(NSManagedObject*) possibleSub { 

    // Depends on your interpretation of subCategory .... 
    if (cat == possibleSub) { return YES; } 

    NSManagedObject* possSubParent = [possibleSub valueForKey:@"parent"]; 

    if (possSubParent == NULL) { return NO; } 

    while (possSubParent != NULL) {  
     if (possSubParent == cat) { return YES; } 

     // move up the tree 
     possSubParent = [possSubParent valueForKey:@"parent"];   
    } 

    return NO; 
} 

// This method gets called by the framework but the values from bindings are used instead 
+0

Я не уверен, что информация, которую вы предоставили, достаточна ... можете ли вы добавить трассировку стека? – fbrereto

+0

Ошибка в отладчике не обеспечила трассировку стека. Как еще я его найду? – Joshua

+0

В консоли отладчика введите «b objc \ _exception \ _throw» (или добавьте исключение, используя окно исключений, Run-> Show-> Breakpoints). Когда отладчик разбивается, откройте окно отладчика (Run-> Debugger). В верхней левой панели отображается трассировка стека. Где-то на трассе следа вы увидите сообщение -copy; первая запись в черном под этим является точкой в ​​вашем коде, которая вызывает проблему. –

ответ

1

Ошибка должна содержать имя класса, получившего непризнанный метод и непризнанный метод, который был отправлен.

(1) Если вы признаете имя метода - если вы написали строку (или строки) кода, который вызывает этот метод, просмотрите строку (строки) кода и убедитесь, что цель метода вызов действителен, имеет правильный тип и не был выпущен где-то в другом месте.

Часто непризнанная ошибка вызова метода возникает, когда вы перевыпускали объект где-то, и новый объект неправильного типа поселился в памяти старого объекта.

(2) Если вы не записали вызов этому методу, то у вас есть другой объект, который не соответствует типу какого-либо объекта, или, опять же, вы что-то перевыпускали.

Если вы подозреваете чрезмерное освобождение, включите NSZombies или используйте функцию отслеживания Zombie в инструментах (да, что сказал Питер).

Таким образом, погрешность NSTreeControllerTreeNode ... doesn't respond to -copyWithZone:.

Почти гарантия, что указывает на то, что вы пытались перетащить дерево дерева контроллера дерева в словарь где-то в качестве ключа, и словарь пытается его скопировать. По крайней мере, это наиболее типично, что происходит.

Это все еще может быть проблемой с высвобождением, когда экземпляр NSTreeControllerTreeNode находится в памяти, где раньше была NSString.

Для получения дополнительной информации о том, как включить его в текущей версии инструментов dev, обратитесь к документации Xcode для NSZombie.

+0

Я думаю, что это должно быть No.2. Когда я перехожу в меню «Run with Performance Tool», у вас нет опции Zombies, как вы можете видеть здесь - http://www.grabup.com/uploads/56e2b7a108333326d1acc6bfdde7d064.png?direct – Joshua

+0

Ну, может быть шаблон Zombies в какая-то гипотетическая будущая версия Xcode, но нет в 3.1.3. ☺ –

+0

Что еще я заметил, так это то, что если я избавлюсь от кода с первого вопроса, приложение работает нормально, без проблем. Поэтому проблема должна быть в том, что в этом коде. – Joshua

0

NSTreeControllerTreeNode не является стандартным классом какао.

Вы имели в виду использовать NSTreeController или NSTreeNode?

+0

Это то, что я на самом деле не использовал. Я заметил, что когда я избавился от кода (код в первом сообщении), приложение запустилось без сбоев, поэтому проблема должна быть в коде из первого сообщения. И я не использую NSTreeControllerTreeNode. – Joshua

+0

Что значит «код в первом посте»? – Abizern

+0

Что я имел в виду, это код, который находится в Вопросе. – Joshua

Смежные вопросы