2010-01-07 18 views
9

tengo el siguiente método UITableView DataSource:nula Retorno de método NSInteger tipo de retorno

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index 

en algunos artículos (es decir, títulos índice de sección) sólo quiero volver "nada", por lo que la vista de tabla ganó' t saltar a cualquier sección. Traté de devolver nulo, pero obtengo el "Retorno hace un entero desde el puntero sin un lanzamiento" - advertencia, ya que NSInteger obviamente no es un objeto, solo un tipodef para enteros de 32/64 bits.

¿Cómo puedo obtener ninguna devolución/reacción en los títulos de índice de sección específica?

Respuesta

21

De vuelta nil es un error porque devuelve una primitiva entera, no un objeto. (Que está recibiendo una advertencia yeso porque nil es en realidad un #define que se evalúa como ((void *)0), que es un puntero nulo, no es un entero igual a cero.) La mejor opción para el código de Objective-C que interactúa con cacao es probablemente usar NSNotFound , un #define para NSIntegerMax que se utiliza en Cocoa para indicar que un valor dado no existe en el receptor, etc. (Otra opción es usar -1, que es más común en el código C. Lo que funciona mejor depende de qué código de llamada espera y puede manejar.)

Aunque NSNotFound es un valor con signo, es lo suficientemente grande como para que sea muy poco probable que se encuentre con un problema de rango. (NSIntegerMax es aproximadamente la mitad de NSUIntegerMax, y muy pocas personas se acercan remotamente a 2.147.483.647 objetos -por no hablar del doble de ellos- en un terreno de 32 bits. En 64 bits, olvídate de eso; te quedarás sin RAM física en tu máquina mucho antes de que se quede sin enteros para los índices.)

Hablando de eso, la convención de Cocoa es usar NSUInteger (en lugar de NSInteger) para los índices. Un entero sin signo no puede ser negativo, que ofrece alguna protección de cordura en valores de índice; entre otras cosas, resulta más fácil ordenar el desbordamiento/desbordamiento de enteros accidentales. Si se trata de un método de origen de datos personalizado (como parece), le sugiero que cambie a usar enteros sin signo. (Puede ser útil recordar/darse cuenta de que NSInteger y NSUInteger ocupan el mismo número de bytes, simplemente interpretan los bits de manera diferente, por lo que no "desperdiciará" ningún espacio cambiando los tipos.)

+0

Gracias Quinn, en mi caso ambos valores parecen funcionar bien. – ff10

+0

Un gran consejo sobre 'NSNotFound', ¡gracias! – Prairiedogg

+0

Hace algunos años que tuve que empezar a hacer mantenimiento. Y mientras mantengo el código, veo actualmente más de 170 advertencias dentro de XCode. ¡Muy pocos causan este error! :-) Gracias! (Y) –