Maison  >  Questions et réponses  >  le corps du texte

objective-c - 为什么这一段Objectc会报错?



#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里面难道不行吗?

阿神阿神2758 Il y a quelques jours733

répondre à tous(4)je répondrai

  • 大家讲道理

    大家讲道理2017-04-24 09:15:51

    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 :

    1. Ajout d'une variable globale de classe NSMutableArray * _array

    2. Ajout de la méthode Get-(NSMutableArray *)array;

    3. 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éthode set de l'attribut. Par conséquent, vous pouvez toujours utiliser 点语法 lorsque vous l'utilisez.

    A

    self.age=age;

    B

    [self setAge:age];

    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

    _age = age;

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-24 09:15:51

    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.

    répondre
    0
  • 高洛峰

    高洛峰2017-04-24 09:15:51

    N'utilisez pas la syntaxe par points ici et placez un trait de soulignement devant vos variables membres pour les distinguer. _age = âge;

    répondre
    0
  • 怪我咯

    怪我咯2017-04-24 09:15:51

    Écrit ici @interface peut être utilisé directement sans ajouter soi-même.
    Juste age = age

    répondre
    0
  • Annulerrépondre