当前位置:  开发笔记 > 数据库 > 正文

传入变量的值不会保留

如何解决《传入变量的值不会保留》经验,为你挑选了1个好方法。

我想分开执行查询.下面的myprepare函数打开数据库连接并运行sqlite3_prepare_v2函数.一旦在myprepare的范围内执行了sqlite3_open,selectstmt和database就会分配有效的地址.但是,一旦我退出myprepare,他们的地址就会被擦除到0x0.

sqlite3_stmt *selectstmt = nil;
sqlite3 *database = nil;

[anInstance myprepare:selectstmt theDatabase:database]; //assignments are fine inside here

//here, the above values will be 0x0

为什么selectstmt和database的值不在myprepare之外?



1> Frank Schmit..:

selectstmt并且database是指向对象的指针.如果希望函数影响指针的值(而不是它指向的对象),则必须通过引用传递它们.换句话说,myprepare:theDatabase:必须原型为:

- (void)myPrepare:(sqlite3_stmt **)selectstmt theDatabase:(sqlite3 **)database;

你必须像这样称呼它:

[anInstance myprepare:&selectstmt theDatabase:&database];

这样您就可以将指针传递给指针,并且可以通过取消引用方法中的参数来更改指针的值.

您的数据库包装器对象实际上应该在内部跟踪数据库句柄,并且您应该将值作为返回值传回,因为它几乎总是比引用更清晰:

MyClass *anInstance = [[MyClass alloc] initAndOpenDatabase];

sqlite3_stmt *selectstmt = [anInstance prepareStatement];

...

[anInstance close];
[anInstance release];

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有