2013-01-13 40 views
3

我試圖用一個NSarray創建一個帶有NSTableView的簡單菜單。當我將數據源設置爲創建的類時,我得到了EXC_BAD_ACCESS錯誤。奇怪的是,它在macruby中工作? 實現文件:NStableview setDatasource EXC_BAD_ACCESS

@implementation TableArray 

- (id) init 
{ 
    self = [super init]; 
    if(self) { 
     arr = [NSArray arrayWithObjects:@"hey", @"what", @"there", nil]; 
    } 
    return self; 
} 

- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView 
{ 
    return [arr count]; 
} 

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn  *)aTableColumn row:(NSInteger)rowIndex 
{ 
    return [arr objectAtIndex:rowIndex]; 
} 

@end 

頁眉:

@interface TableArray: NSObject <NSTableViewDataSource> { 
    NSArray *arr;  
} 

- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView; 
- (id) tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex; 
@end 

而在應用程序委託:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    TableArray *arr = [[TableArray alloc] init]; 
    [tv setDataSource:arr]; 
    [tv reloadData]; 
} 

和委託方頭:

#import <Cocoa/Cocoa.h> 

@interface AppDelegate : NSObject <NSApplicationDelegate> { 
    IBOutlet NSTableView *tv; 
} 

@property (assign) IBOutlet NSWindow *window; 

@end 
+0

您還沒有初始化電視,應該忽略沒有定位的消息。 –

+0

tv是一個IBOutlet,用於在界面構建器中進行的tableview。我也有ARC啓用。程序崩潰是主要問題。 – user1975095

+2

很確定發生的事情是這樣的:你實例化一個'TableArray',將其賦值爲'tv'的dataSource(這是一個弱屬性),然後,不存在對'arr'的強引用,所以它是釋放。保留'arr'來解決問題。 –

回答

0

這將是有益的知道在哪裏你正在初始化*電視。我假設你已經將它放置在應用程序啓動時加載的一些NIB文件中。
然後,你應該把IBOutlet NSTableView *tv;放在一個ViewController中,理想的是子類UITableViewController。一個tableView引用/插座屬於那裏。 另外,使用viewController本身作爲dataSource會更容易,並在Interface Builder中建立連接。

+0

我已經有了-_-。我只是試圖設置一個簡單的菜單,使用數組和菜單。它在macruby中的工作幾乎完全相同。它的Mac OS X應用程序不是iOS的。 – user1975095

+0

噢,好吧......你無法知道MacRuby幕後發生了什麼 – tompave

1

我打賭你已經啓用了ARC(可能是GC)。 NSTableView對它的數據源保留了一個弱引用,並且你沒有保持對它的強烈引用,所以ARC在你完成之前釋放你的數據源。

請注意,數據源像這樣漂浮極其罕見。由於數據源是表和底層數據存儲之間的通道,因此它幾乎可以肯定是應用程序控制層的一部分。

它可能在MacRuby下工作,因爲代碼稍有不同或者由於實現細節。