Pergunta

NSInteger/NSUInteger são substitutos definidos pelo Cocoa para os tipos integrados regulares.

Existe algum benefício em usar os tipos NS* em vez dos integrados?Qual você prefere e por quê?São NSInteger e int a mesma largura em plataformas de 32/64 bits?

Foi útil?

Solução

Pelo que entendi é que NSInteger et al.são versões seguras de arquitetura dos tipos C correspondentes.Basicamente seu tamanho varia dependendo da arquitetura, mas o NSInteger, por exemplo, tem garantia de conter qualquer ponteiro válido para a arquitetura atual.

A Apple recomenda que você os use para trabalhar com o OS X 10.5 e posteriores, e as APIs da Apple os usarão, então é definitivamente uma boa ideia adquirir o hábito de usá-los.Eles exigem um pouco mais de digitação, mas fora isso não parece haver razão para não usá-los.

Outras dicas

Problemas de quantização para tempo de execução de 64 bits

Em algumas situações pode haver uma boa razão para usar tipos padrão em vez de NSInteger:Inchaço de memória "inesperado" em um sistema de 64 bits.

Claramente, se um número inteiro for 8 em vez de 4 bytes, a quantidade de memória ocupada pelos valores será duplicada.Dado que nem todo valor é um número inteiro, normalmente você não deve esperar que o consumo de memória do seu aplicativo dobre.No entanto, a forma como o Mac OS X aloca a memória muda dependendo da quantidade de memória solicitada.

Atualmente, se você solicitar 512 bytes ou menos, malloc arredonda para o próximo múltiplo de 16 bytes.Se você solicitar mais de 512 bytes, no entanto, malloc arredonda para o próximo múltiplo de 512 (pelo menos 1024 bytes).Suponha então que você defina uma classe que - entre outras - declare cinco NSInteger variáveis ​​de instância, e que em um sistema de 32 bits cada instância ocupa, digamos, 272 bytes.Em um sistema de 64 bits, as instâncias exigiriam, em teoria, 544 bytes.Mas, devido à estratégia de alocação de memória, cada um ocupará, na verdade, 1.024 bytes (um aumento de quase quatro vezes).Se você usar um grande número desses objetos, o consumo de memória do seu aplicativo poderá ser consideravelmente maior do que você poderia esperar.Se você substituiu o NSInteger variáveis ​​com sint_32 variáveis, você usaria apenas 512 bytes.

Ao escolher qual escalar usar, portanto, certifique-se de escolher algo sensato.Existe algum motivo pelo qual você precisa de um valor maior do que o necessário em seu aplicativo de 32 bits?É improvável que seja necessário usar um número inteiro de 64 bits para contar um número de segundos ...

64 bits é na verdade a razão de ser do NSInteger e do NSUInteger;antes de 10.5, eles não existiam.Os dois são simplesmente definidos como longs em 64 bits e como ints em 32 bits:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

Assim, use-os no lugar dos tipos C mais básicos quando desejar o tamanho 'bit-nativo'.

CocoaDev tem mais algumas informações.

Eu prefiro as declarações de estilo C padrão, mas apenas porque alterno entre vários idiomas e não preciso pensar muito sobre isso, mas parece que deveria começar a olhar para o nsinteger

Para importar e exportar dados para arquivos ou pela rede eu uso UInt32, SInt64 etc...

É garantido que eles tenham um determinado tamanho independente da arquitetura e auxiliam na portabilidade do código para outras plataformas e linguagens que também compartilham esses tipos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top