2017-07-06 77 views
0

EXC_BAD_ACCESS導致我的應用程序崩潰。當您嘗試訪問單元化或釋放內存時,通常會發生此問題,但我找不到位置。我試圖與Xcode殭屍檢查沒有成功。應用程序崩潰和樂器不會注意到殭屍。 我正在使用ARC。讀取文件後,EXC_BAD_ACCESS發生Objective-C崩潰

不良訪問發生在方法結尾處,在結束的大括號中。 (見截圖)。此問題僅在發佈模式(優化)下發生,並且僅適用於少數設備。

enter image description here

爲了測試,我做了一個假項目中,方法didFinishLaunching後立即調用。

調用堆棧

  1. didFinishLaunchingWithOptions
  2. 的Alloc和init我的自定義對象
  3. 呼叫READFILE新創建的對象
  4. 在READFILE
  5. 即將退出READFILE,但應用程序執行代碼死機

下面的代碼

- (void)readFromFile:(NSString *)fileName { 
    if (!fileName) { 
     return; 
    } 

    NSString* filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:nil]; 
    if (!filePath) { 
     return; 
    } 

    FILE* file = fopen([filePath UTF8String], "r"); 
    if (file == NULL) { 
     return; 
    } 

    size_t length; 
    char *cLine = fgetln(file, &length); 

    // I don't think it matters, but the file has about 400 000 lines 
    while (length > 0) { 
     char str[length - 1]; // All lines length are > 2 
     strncpy(str, cLine, length); 
     str[length - 1] = '\0'; // The crash would still occurs without this line, but less often 

     // Custom code with str 

     cLine = fgetln(file, &length); 
    } 
    fclose(file); 
} 

在情況下,它可以幫助你的簡化版本,這裏是我的讀者對象的代碼

@protocol MyReaderProtocol <NSObject> 
- (void)readFromFile:(NSString *)fileName; 
@end 

@interface MyReader : NSObject <MyReaderProtocol> 
@end 

// How I initialize the objet in the app delegate 
MyReader myReader = [[MyReader alloc] init]; 
[myReader readFromFile:@"myFile.txt"]; 
+0

您在其他某處有問題。代碼運行良好。 – Nirmalsinh

回答

0

基於閱讀你的代碼只

功能致電fgetln()返回length該行中的字符數。字符

A C-陣列Ñ元件被聲明爲char a[n]和元件被作爲a[0]尋址到a[n-1]

您需要存儲length個字符加上1個EOS,則分配一個容量爲length - 1的陣列,這個陣列太短。您的strncpy()然後寫入數組的末尾。

最後您在索引length - 1處編寫EOS,然後最大索引爲length - 2

您只覆蓋1個字節(您在該行的最後一個字符上寫入EOS),但這足以摧毀堆棧上的陣列旁邊的任何內容(可能是cLine ...)

HTH

+0

你是對的,這對我來說是一個關於strncpy和fgetln的誤解。 我改變了字符str [長度-1]到字符str [長度+ 1],它的工作。 謝謝! – Julien

相關問題