Veo una gran cantidad de código objetivo-c que simplemente # define las constantes locales que necesita, y luego continúa de manera feliz. El problema es que, hasta donde yo sé, #defines no tienen alcance. Muchos de ellos están en el código de ejemplo de Apple. Por ejemplo, en el TableViewSuite ejemplo 5, la función drawRect en TimeZoneView.m contiene el bloque siguiente:Mejores prácticas para las constantes locales en el objetivo-c
#define LEFT_COLUMN_OFFSET 10
#define LEFT_COLUMN_WIDTH 130
#define MIDDLE_COLUMN_OFFSET 140
#define MIDDLE_COLUMN_WIDTH 110
#define RIGHT_COLUMN_OFFSET 270
#define UPPER_ROW_TOP 8
#define LOWER_ROW_TOP 34
#define MAIN_FONT_SIZE 18
#define MIN_MAIN_FONT_SIZE 16
#define SECONDARY_FONT_SIZE 12
#define MIN_SECONDARY_FONT_SIZE 10
¿Hay alguna razón que no entiendo que esto no es absurdamente peligroso? Como mínimo, ¿no deberíamos #undef estas constantes al final de la función?
Esa es mi pregunta supongo:
¿Es una mejor práctica para definir lo que necesita en el archivo que lo necesite, y poco lo definen al final? ¿O crees que es mejor usar consts estáticos para este tipo de cosas? ¿Hay alguna penalización de rendimiento al usar consts estáticos, o el compilador puede manejarlos tan eficientemente como #define?
Genial, gracias Ben, creo que eso responde. Estoy de acuerdo en que es probablemente trivial, pero las cosas triviales pueden sumarse y, en igualdad de condiciones, prefiero tener el hábito de usar las convenciones de rendimiento por defecto. De esa manera, cuando encuentres un caso donde importa, ya tienes el hábito de hacerlo. – DougW
Constantes de cadena, es decir, las definidas con @ "" son singleton/atoms y dicen un poco de memoria y tiempo. NSNumbers son de la misma manera. En cualquier proceso dado, solo hay una instancia generada por [NSNumber numberWithInt: 1]. – TechZen
NSNumber pone en práctica un subconjunto pequeño, no el rango completo de enteros, mientras que las NSStrings constantes siempre se intercalarán – rpetrich