2011-02-03 184 views
1

我正在開發一個小文本編輯器,我開始使用表視圖模板,添加代碼列出應用程序Documents目錄的內容,並且一切正常,我將一些文件複製到目錄和表視圖顯示它們,但是當我開始滾動時,它崩潰。我認爲有些東西在沒有必要時會被釋放。在這裏,我離開了代碼和崩潰日誌:)滾動時在UITableView崩潰

RootViewController.m

NSFileManager *directoryContent; 
- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self listDumpFiles]; 
} 
// Customize the number of sections in the table view. 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 


// Customize the number of rows in the table view. 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return [directoryContent count]; 
} 


// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    // Configure the cell. 
    cell.text = [directoryContent objectAtIndex:indexPath.row]; 
    return cell; 
} 
- (void)listDumpFiles { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: documentsDirectory]; 

    NSLog(@"%@", documentsDirectory); 
    return; 
} 

崩潰日誌

2011-02-03 17:38:16.516 uNotes[15352:40b] /Users/pablo/Library/Application Support/iPhone Simulator/4.2/Applications/DF298F31-5723-4A1E-9EAA-3353C34BDCB2/Documents 
2011-02-03 17:38:17.412 uNotes[15352:40b] -[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x9b243f0 
2011-02-03 17:38:17.413 uNotes[15352:40b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString objectAtIndex:]: unrecognized selector sent to instance 0x9b243f0' 
*** Call stack at first throw: 
(
    0 CoreFoundation      0x00da7be9 __exceptionPreprocess + 185 
    1 libobjc.A.dylib      0x00efc5c2 objc_exception_throw + 47 
    2 CoreFoundation      0x00da96fb -[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
    3 CoreFoundation      0x00d19366 ___forwarding___ + 966 
    4 CoreFoundation      0x00d18f22 _CF_forwarding_prep_0 + 50 
    5 uNotes        0x0000238c -[RootViewController tableView:cellForRowAtIndexPath:] + 216 
    6 UIKit        0x003247fa -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 634 
    7 UIKit        0x0031a77f -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:] + 75 
    8 UIKit        0x0032f450 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1561 
    9 UIKit        0x00327538 -[UITableView layoutSubviews] + 242 
    10 QuartzCore       0x01c65451 -[CALayer layoutSublayers] + 181 
    11 QuartzCore       0x01c6517c CALayerLayoutIfNeeded + 220 
    12 QuartzCore       0x01c5e37c _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 310 
    13 QuartzCore       0x01c5e0d0 _ZN2CA11Transaction6commitEv + 292 
    14 QuartzCore       0x01c8e7d5 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 99 
    15 CoreFoundation      0x00d88fbb __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27 
    16 CoreFoundation      0x00d1e0e7 __CFRunLoopDoObservers + 295 
    17 CoreFoundation      0x00ce6bd7 __CFRunLoopRun + 1575 
    18 CoreFoundation      0x00ce6240 CFRunLoopRunSpecific + 208 
    19 CoreFoundation      0x00ce6161 CFRunLoopRunInMode + 97 
    20 GraphicsServices     0x016dc268 GSEventRunModal + 217 
    21 GraphicsServices     0x016dc32d GSEventRun + 115 
    22 UIKit        0x002bf42e UIApplicationMain + 1160 
    23 uNotes        0x00001fc0 main + 102 
    24 uNotes        0x00001f51 start + 53 
) 
terminate called after throwing an instance of 'NSException' 
Program received signal: 「SIGABRT」. 
(gdb) 

回答

4

根據您正試圖調用objectAtIndex:一個字符串的堆棧跟蹤。可能是內存管理問題。 Enable zombies以獲得有關它被調用的對象的更多信息。

UPDATE

這可能是此行

directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: documentsDirectory];

我覺得directoryContentsAtPath:返回一個自動釋放的對象。如果您的標頭中有directoryContent設置爲@property(nonatomic, retain),則可以使用self.directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: documentsDirectory];進行設置,並且它會自動保留由NSFileManager返回的對象,否則可以調用directoryContent = [[[NSFileManager defaultManager] directoryContentsAtPath: documentsDirectory] retain];,但一定要在不再需要時釋放該對象。

+0

我得到這個,我認爲是需要發佈的東西:'2011-02-03 17:54:51.102 uNotes [15418:40b]/Users/pablo/Library/Application Support/iPhone Simulator/4.2 /應用/ DF298F31-5723-4A1E-9EAA-3353C34BDCB2/Documents 2011-02-03 17:54:56.785 uNotes [15418:40b] *** - [__ NSArrayM objectAtIndex:]:發送到釋放實例0x921fc60的消息 (gdb) ' – pmerino 2011-02-03 16:56:44