2011-09-19 4 views
0

Dans ma quête pour être le grand maître de l'objectif C, je continue à courir dans elle est subtilités que je veux partager avec YA'LL et mieux comprendre pourquoiObjectif C manigances

1) J'ai deux méthodes d'initialisation, celle qui est héritée par NSObject pour mon objectif de classe C et on est une méthode personnalisée que je crée de mon propre, disons

initCustomMethod:(int)par1 argument2:(int)par2; 

mon objectif est d'appeler initCustomMethod par la méthode d'initialisation fournie, essentiellement

-(id)init{ 
    return [self initCustomMethod:1 argument2:3]; 
} 

Naturellement, en maintenant l'ordre, j'ai init qui apparaît avant initCustomMethod dans le fichier .m. Xcode me prévient que l'initCustomMethod n'est pas trouvé, je vais de l'avant et je mélange l'ordre et j'ai l'initialisation de init après que initCustomMethod est déclaré et il n'y a plus de message d'avertissement et tout va bien. Je suis d'accord que l'ordre est important car il est essentiellement dérivé de C, mais je ne suis pas sûr de cela. Parce que, j'ai mélangé l'ordre de certaines propriétés et de leurs méthodes personnalisées, avec les propriétés @synthesize étant déclarées après la méthode de définition personnalisée pour une propriété donnée, mais il n'y avait pas une telle réplique d'erreur.

Quelqu'un peut-il signaler la malveillance ici?

Merci les gars !!!


Très cool, merci de m'avoir aidé. De plus, comme j'ai une méthode init personnalisée, j'initialise le super dans cette méthode et utilise la méthode init originale pour appeler la méthode init personnalisée.

Quelque chose ne va pas avec ça?

Répondre

5

Avant de référencer partout, vous devez déclarer initCustomMethod:argument2 dans votre interface, ce qui serait habituellement dans votre fichier d'en-tête.

Par exemple, vous auriez généralement un fichier .h qui ressemble à:

@interface MyClass 
{ 
    //instance variables 
    int anInstanceVariable; 
} 

// properties 
@property (nonatomic, assign) int aProperty; 

// methods 
-(id)initCustomMethod:(int)par1 argument2:(int)par2; 

@end 

Et si vous avez fait cela, l'ordre dans lequel vous définirinit et initCustomMethod:argument2: ne sera pas question. Cela est dû au fait que la déclaration indique au compilateur que vous êtes allez à définissez la méthode, et à quoi elle ressemblera, afin qu'elle ne soit pas confondue lorsque vous l'utiliserez plus tard.

2

C'est une mauvaise idée dans Objective-C d'utiliser une fonction ou une méthode avant qu'elle ne soit déclarée ou définie. Mettre initCustomMethod:argument2: avant init signifie que le premier est déjà défini dans le second. Mais si vous le déclarez simplement dans l'en-tête, peu importe l'ordre dans lequel il est entré.

2

Ajoutez votre nom de méthode personnalisé dans votre fichier d'en-tête - le compilateur passe simplement en revue les choses dans l'ordre. Si vous n'avez pas de déclaration forward, le compilateur ne saura pas quoi faire avec cet appel. Vous aurez besoin de le mettre dans l'en-tête si vous voulez que d'autres parties de votre programme puissent l'appeler de toute façon.