#import <Foundation/Foundation.h>
@interface Person :NSObject
{
int age;
NSString * name;
}
-(void)setAge:(int)age;
-(void) sayHi;
@end
@implementation Person
-(void)setAge:(int)age{
self.age=age;
}
-(void)sayHi{
NSLog(@"im jerry %d",age);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person* p=[Person new];
[p setAge:5];
[p sayHi];
}
return 0;
}
self.age=age;
这里报错了。
在java里面,不是this.age=age吗?oc里面难道不行吗?
En objectif-c, bien que l'attribut soit appelé comme une simple opération d'affectation et de valeur, en fait, l'utilisation de l'attribut est un appel de méthode !
Par exemple :
@property(copy) NSMutableArray *array;
Une fois cet attribut ajouté, il ressemble à une variable. En fait, le compilateur fait plus que simplement ajouter une variable :
Ajout d'une variable globale de classe NSMutableArray * _array
Ajout de la méthode Get-(NSMutableArray *)array;
Ajout de la méthode Set-(void)setArray:(NSMutableArray *)array;
Bien que votre code n'utilise pas
@property
pour spécifier les attributs, il lui manque un nom de méthode qui correspond à la méthodeset
de l'attribut. Par conséquent, vous pouvez toujours utiliser点语法
lorsque vous l'utilisez.A
B
A et B sont équivalents ! Après compilation, A sera converti sous la forme de B, et B sera ensuite converti sous la forme d'un appel de fonction C !
Vous appelez
-setAge:
dans la méthode-setAge:
, ce qui entraîne une récursivité infinie. Si vous remarquez la pile du programme lorsqu'il plante, vous constaterez que la pile est pleine de-setAge:
.Si vous souhaitez éviter ce problème, utilisez simplement l'affectation directe des variables de classe
L'explication détaillée est celle mentionnée ci-dessus, en bref :
La syntaxe par points dans OC n'est qu'une fonctionnalité du compilateur, et l'essence est toujours l'appel de méthode.
N'utilisez pas la syntaxe par points ici et placez un trait de soulignement devant vos variables membres pour les distinguer. _age = âge;
Écrit ici @interface peut être utilisé directement sans ajouter soi-même.
Juste age = age