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

我还在继续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

学习是最好的投资!

모든 응답(1)
小葫芦

srcEntry.name의 @property(매개변수 1, 매개변수 2) 속성의 매개변수는 무엇입니까?

다음과 같이 말씀하셨습니다. 이 기간 동안 배열의 요소를 변경하지 않았으며 배열을 다른 위치로 복사했습니다.


예: 다음은 시나리오 시뮬레이션입니다
다음과 같이 두 개의 속성을 선언하는 경우:

으아악

정의 으아악

아래 출력은 무엇입니까?

으아악

결과는 다음과 같습니다. 문자열 2 = null


self.string1과 self.string2는 동일한 주소를 가리키고 string2는 메모리 주소를 유지하지 않으며 self.string1=nil은 메모리를 해제하므로 string1은 nil입니다. 약한 것으로 선언된 포인터의 경우 포인터가 가리키는 주소가 해제되면 이러한 포인터에는 nil 값이 할당됩니다.

이름 속성이 약하거나 복사로 변경하는 것이 가장 좋은 것 같습니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿