objective-c - c字符串转换到NSString
PHPz
PHPz 2017-04-24 09:13:17
0
1
568

我还在继续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的属性。我试验了,调用任何方法都报错,并且像是死循环一样,断点一直反复进入那个地方出不来。请问有没有什么办法,绕过这个错?

PHPz
PHPz

学习是最好的投资!

répondre à tous(1)
小葫芦

Quels sont les paramètres de l'attribut @property (paramètre 1, paramètre 2) de votre srcEntry.name Avez-vous activé ARC ?

Vous avez dit : Je n'ai apporté aucune modification aux éléments du tableau pendant cette période, j'ai simplement copié le tableau à un autre endroit.


par exemple, ce qui suit est une simulation de scénario
Si vous déclarez deux propriétés comme ceci :

@property (nonatomic, strong) NSString *string1;   

@property (nonatomic, weak) NSString *string2; 

et définir

@synthesize string1;   

@synthesize string2;  

Quel est le résultat ci-dessous ?

self.string1 = @"String 1";   

self.string2 = self.string1;   

self.string1 = nil;  

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

Le résultat est : Chaîne 2 = null


Puisque self.string1 et self.string2 pointent vers la même adresse, et que string2 ne conserve pas l'adresse mémoire et que self.string1=nil libère la mémoire, string1 est nul. Pour les pointeurs déclarés faibles, une fois l'adresse pointée par le pointeur libérée, ces pointeurs se verront attribuer une valeur nulle.

Je pense que votre attribut de nom est faible ou attribué. Il est préférable de le modifier pour copier

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal