2010-02-01 6 views
1

Est-il vrai de dire que lorsque vous utilisez des entiers lorsque vous programmez pour iphone, vous ne les synthétisez pas et vous ne les libérez pas.objectif c iphone entiers

Si c'est vrai, quelqu'un pourrait-il expliquer pourquoi?

Chaque fois que j'essaie, j'obtiens des erreurs. Aussi, si je mets un @property pour une valeur entière, j'obtiens aussi des erreurs

+0

Quelles sont les erreurs? ___ – kennytm

Répondre

2

Vous pouvez synthétiser int -s. Mais vous devez les déclarer comme assign -properties:

@property(assign) int X; 
5

En Objective-C, un int est un type primitif, alors qu'une NSNumber (ou d'autres choses semblables) sont des objets. Les types primitifs, car ils ne supportent pas beaucoup de choses objets ne (comme méthodes getter et setter), ne peuvent être déclarés

@property(assign) int x;

De même, vous ne les relâchez pas, car cela vous impliquer » re envoyer un message -release à une primitive, qui ne prend pas en charge la messagerie. Vous pouvez @synthesize ou @dynamic eux, mais seulement si vous leur donnez la propriété (assign) appropriée.

La version courte: les primitives comme int n'ont pas de messages ou de méthodes. N'essayez pas de leur en donner.

+2

Uhh ... vous devez '@ synthesize 'parce que vous l'avez déclaré comme une' @ property' ... –

+0

@Dave: Nah, vous pouvez '@ dynamic' aussi. – kennytm

+0

@Dave DeLong: bon point, merci - pas encore tout à fait éveillé :) – Tim

1

Si vous déclarez votre entier comme 'NSInteger' ou un int primitif de style C, alors ce que vous dites est vrai. Mais pas si vous utilisez la classe NSNumber. Permettez-moi d'expliquer:

NSInteger n'est pas une classe Objective-C.Il n'est rien de plus qu'un synonyme d'un nombre entier. NSInteger est défini comme ceci:

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

NSNumber est une classe Objective-C, et une sous-classe de NSValue. Il est possible de créer un objet NSNumber à partir d'un char signé ou non signé, int court, int, long int, long long int, float, double ou BOOL. Parmi les deux, NSNumber ne peut être utilisé que dans des collections, telles que NSArray, où un objet est requis, mais NSInteger ne peut pas être utilisé directement.

2

Deux commentaires:

  • NSNumber est beaucoup plus lent que, par exemple, int. En général, si vous pouvez vous en sortir en utilisant des valeurs scalaires, faites-le.

  • Lorsque vous définissez les propriétés, utilisez «nonatomic» dans la mesure du possible. Il permet une amélioration significative des performances (avec certains risques, bien sûr, si vous avez plus d'un thread qui agit sur lui).

+0

+1 d'excellents points –