Pregunta

Estoy trabajando en una aplicación para el iPhone usando objetivo C. Tengo clase A, lo que crea un puntero NSMutableArray llamada "lista". Pero, en la clase A, que nunca crear un objeto para que se señale. En su lugar, yo llamo un método de clase de la clase B, para obtener algunos datos de una base de datos SQLite, y poblar un objeto NSMutableArray allí. Quiero ser capaz de establecer el puntero de la clase A al punto al objeto NSMutableArray creado en el método de la clase B pasándolo como un argumento para el método. No puedo hacerlo mediante la devolución de la matriz porque quiero devolver el resultado de SQLite.

Me pregunto si estoy haciendo bien? No he escrito todo el método todavía (cuando se hace que va a ser bastante larga), pero quiero saber si estoy haciendo las cosas correctamente puntero antes de empezar a trabajar en el resto.

//ClassA.m

//...
NSMutableArray *list;
[ClassB populateArrayFromSqlite:&list];
//Now do stuff with "list", which should point to the array created in populateArrayFromSqlite
//...

//ClassB.m
+(int)populateArrayFromSqlite:(NSMutableArray**)ar {
    NSMutableArray *array = [[NSMutableArray alloc] init];
    //Here there will be code that populates the array using sqlite (once I write it)
    //And then I need to set the "list" pointer in ClassA.m to point to this array
    ar = &array; //Is this how?

    return resultFromSqlite;
}

¿Hice lo correcto? O estoy no entender algo? Creo que estas cosas-puntero a puntero simplemente no hace clic conmigo todavía. Después de leer unas pocas fuentes generales acerca de los punteros, sospecho que esta es la forma en que lo haría, pero una parte de mí no entiende por qué el argumento ar no puede ser sólo un puntero normal (en oposición a un puntero puntero a) .

¿Fue útil?

Solución

Los punteros a punteros son una escheric poco, sí. La forma más sencilla de hacerlo sería crear una matriz vacía en A y pasar un puntero matriz regular a B que acaba de llenar. Si usted insistió en la creación de la matriz en B, creo que se podría hacer esto:

- (void) createArray: (NSMutableArray**) newArray
{
    NSAssert(newArray, @"I need a pointer, sweetheart.");
    *newArray = [[NSMutableArray alloc] init];
    [*newArray addObject:...];
}

Otros consejos

Cambiar punteros a objetos como esto es bastante raro en Objective-C. El tiempo principal que vemos cosas como esta es cuando un método tiene un potencial de fallo, momento en el que vamos a pasar en un puntero a una referencia NSError. Por ejemplo, NSFileManager de - (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error.

La forma más común de hacer esto sería tener el retorno método de la matriz:

NSMutableArray * list = [ClassB mutableArrayFromSQLite];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top