调试'消息发送到解除分配的实例'

时间:2013-02-26 06:45:29

标签: objective-c cocoa memory-management automatic-ref-counting

好的,所以我再次面对可怕的message sent to deallocated instance ......

  • 我使用DMTabBar(基本上是类似Xcode的TabBar控件)
  • 启用ARC

现在,这是合约:

  • 控件附带的示例正常
  • 我已经启用了僵尸(甚至尝试使用乐器进行调试,但实际上 - 我不知道该寻找什么)
  • deallocated实例是TabBar的tabBarItems数组(托管不同按钮的数组)。

这是我添加项目的方式:

NSMutableArray* sidebarItems = [@[
        [DMTabBarItem tabBarItemWithIcon:[NSImage templateImageNamed:@"One" withSize:iconSize] tag:0 tooltip:@"Files"],
        [DMTabBarItem tabBarItemWithIcon:[NSImage templateImageNamed:@"Two" withSize:iconSize] tag:1 tooltip:@"Explorer"],
        [DMTabBarItem tabBarItemWithIcon:[NSImage templateImageNamed:@"Three" withSize:iconSize] tag:2 tooltip:@"Bookmarks"],
        [DMTabBarItem tabBarItemWithIcon:[NSImage templateImageNamed:@"Four" withSize:iconSize] tag:3 tooltip:@"Search"]
    ] mutableCopy];

[sidebarTabs setTabBarItems:items];

// Handle selection events
[sidebarTabs handleTabBarItemSelection:^(DMTabBarItemSelectionType selectionType, DMTabBarItem *targetTabBarItem, NSUInteger targetTabBarItemIndex) {
        if (selectionType == DMTabBarItemSelectionType_WillSelect) {
            [sidebarTabView selectTabViewItem:[sidebarTabView.tabViewItems objectAtIndex:targetTabBarItemIndex]];
        } else if (selectionType == DMTabBarItemSelectionType_DidSelect) {
        }
    }];

这是声明不同元素的方式:

@interface myAppl : NSWindowController
{
    IBOutlet DMTabBar* sidebarTabs;
    IBOutlet NSTabView* sidebarTabView;
} 

这是DMTabBar的界面(最重要的"部分)

@interface DMTabBar : NSView {

}

// set an NSArray of DMTabBarItem elements to populate the DMTabBar
@property (nonatomic,strong) NSArray*           tabBarItems;

// change selected item by passing a DMTabBarItem object (ignored if selectedTabBarItem is not contained inside tabBarItems)
@property (nonatomic,assign) DMTabBarItem*      selectedTabBarItem;

请你告诉我,我做错了什么?我绝对不是不是有记忆管理的大师(是的,我承认我还有一些学习要做)但是我肯定会因为这个而自杀...

我设置tabBarItems并且它们似乎在那里(至少在开始时)。他们为什么被释放? (记住控件和项目代码都使用ARC)。

有什么想法吗? (如果您需要了解其他任何事情,请告诉我。)

2 个答案:

答案 0 :(得分:1)

您是否尝试使用通常的内存调试技术运行,即

  • 乐器与Zombies和
  • 在Xcode的编辑方案>中设置各种标记。诊断>内存管理标签?

答案 1 :(得分:0)

仅当它不是对象,委托和IBoutlet时才使用assign。

改变这个:

@property (nonatomic,assign) DMTabBarItem*      selectedTabBarItem;

到此:

@property (nonatomic,strong) DMTabBarItem*      selectedTabBarItem;