objective-c - 为什么这一段Objectc会报错?
阿神
阿神 2017-04-24 09:13:51
0
4
686


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

阿神
阿神

闭关修行中......

répondre à tous(4)
大家讲道理

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;
Peter_Zhu

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!