搜尋

首頁  >  問答  >  主體

objective-c - c字串轉換到NSString

我還在繼續svn客戶端的專案。我在objective-c物件體外,有個靜態的c語言的回呼方法。其中,我將char*轉換成了NSString,調試時一切正常。但運行到後面的時候,字串變數會丟掉,並且只要一取出這個屬性,就報錯。

char* 轉換到NSString的程式碼:

static svn_error_t *
my_list_repo_func (void *baton,
                   const char *path,
                   const svn_dirent_t *dirent,
                   const svn_lock_t *lock,
                   const char *abs_path,
                   apr_pool_t *pool)
{
    printf ("%s\n",path);

    SrcEntry *srcEntry = [[SrcEntry alloc]init];
    // 注:后面取这个name属性时会报错
    srcEntry.name = [NSString stringWithUTF8String:path];
    srcEntry.path = [NSString stringWithUTF8String:abs_path];
    srcEntry.lastAuthor = [NSString stringWithUTF8String:dirent -> last_author];
    srcEntry.time = [NSNumber numberWithLong:dirent -> time];

    [srcEntries addObject:srcEntry];
    return SVN_NO_ERROR;
}

後面呼叫報錯的地方(此處為一個tableview刷新時候的方法):

- (id) tableView: (NSTableView *)table
objectValueForTableColumn: (NSTableColumn *)column
             row: (NSInteger)row {

    SrcEntry *srcEntry = [self.srcEntries objectAtIndex:row];
    return srcEntry.name;
}

最奇怪的是,我在剛開始轉換完,調試看到的值和類型,和後面報錯前看到的完全不一樣。下面是兩張除錯變數時候的截圖:

這張是報錯前,除錯變數截圖:

註:就是在讀取第二個元素的name屬性的時候出錯。這中間我並沒有對數組裡面的元素做任何改動,只是把數組拷貝到了另一個地方。為什麼類型和值都會改變呢?

追加:並且,從截圖中可以看出屬性path的值都丟掉了。變成了一串記憶體位址。難道我需要用*符號,再取出實際的數值嗎?

追加2:第二張截圖中,顯示為(NSString *) xxxxx像是記憶體位址的name的屬性。我試驗了,調用任何方法都報錯,而且像是死循環一樣,斷點一直反覆進入那個地方出不來。請問有沒有辦法,繞過這個錯?

PHPzPHPz2766 天前575

全部回覆(1)我來回復

  • 高洛峰

    高洛峰2017-04-24 09:15:17

    你srcEntry.name的@property(參數1,參數2)屬性 參數是啥 開了ARC?

    你說:這中間我並沒有對數組裡面的元素做任何改動,只是把數組拷貝到了另外一個地方。


    e.g.下面是情境模擬
    如果這樣聲明兩個屬性:

    @property (nonatomic, strong) NSString *string1;   
    
    @property (nonatomic, weak) NSString *string2; 
    

    並定義

    @synthesize string1;   
    
    @synthesize string2;  
    

    下面輸出是什麼?

    self.string1 = @"String 1";   
    
    self.string2 = self.string1;   
    
    self.string1 = nil;  
    
    NSLog(@"String 2 = %@", self.string2);  
    

    結果是:String 2 = null


    由於self.string1與self.string2指向同一位址,且string2沒有retain記憶體位址,而self.string1=nil釋放了內存,所以string1為nil。宣告為weak的指針,指針指向的位址一旦被釋放,這些指標都會被賦值為nil。

    我覺得你name屬性不是weak就是assign 最好改成copy

    回覆
    0
  • 取消回覆