2009-12-28 6 views
0

Je souhaite séparer l'exécution d'une requête. La fonction myprepare ci-dessous ouvre la connexion à la base de données et exécute la fonction sqlite3_prepare_v2. Une fois que sqlite3_open est exécuté dans le cadre de myprepare, selectstmt et database ont des adresses valides qui leur sont assignées. Cependant, une fois que je sors de myprepare, leurs adresses sont effacées à 0x0. Pourquoi les valeurs de selectstmt et de la base de données ne sont-elles pas conservées en dehors de myprepare? Les valeurs des variables passées ne sont pas conservées

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

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

//here, the above values will be 0x0 

+0

Pour ceux qui ne veulent pas passer 5 minutes à se gratter la tête: "retenir" dans ce sens n'a pas à faire avec la gestion de la mémoire, mais devrait être "Les valeurs des variables passées ne sont pas conservées". –

Répondre

7

selectstmt et database sont des pointeurs vers des objets. Si vous voulez qu'une fonction affecte la valeur du pointeur (plutôt que l'objet vers lequel elle pointe), vous devrez les passer par référence. En d'autres termes, myprepare:theDatabase: devrait être prototypé comme:

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

Et vous devez l'appeler comme ceci:

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

De cette façon, vous passez un pointeur vers un pointeur, et vous pouvez changez la valeur du pointeur en déréférençant le paramètre dans la méthode.

Votre objet wrapper de base de données devrait vraiment être garder une trace de la base de données interne gérer, et vous devriez être repassant vos valeurs en tant que valeurs de retour, car il est presque toujours plus propre que par référence:

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

sqlite3_stmt *selectstmt = [anInstance prepareStatement]; 

... 

[anInstance close]; 
[anInstance release]; 
Questions connexes