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


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

阿神
阿神

闭关修行中......

全員に返信(4)
大家讲道理

Objective-C では、属性は単純な代入と値の操作として呼び出されますが、実際には、属性の使用はメソッド呼び出しです。

例:

@property(copy) NSMutableArray *array;
このプロパティが追加されると、それは変数のように見えます。実際、コンパイラは単に変数を追加するだけではありません。

  • @property(copy) NSMutableArray *array;
    这个属性添加以后,用起来好像是一个变量,其实编译器做的不仅仅是添加了一个变量:
    1. 添加了一个类全局变量NSMutableArray * _array

    2. 添加了Get方法-(NSMutableArray *)array;

    3. 添加了Set方法-(void)setArray:(NSMutableArray *)array;

    你的代码中虽然没有使用@property,指定属性,但是缺命名了一个符合属性的set方法的方法名,因此,使用时一样可以使用点语法

    A

    self.age=age;

    B

    [self setAge:age];

    A、B两者是等效的!编译后,A会被转化成B的形式,而B会进一步转化成C函数调用的形式!

    你在-setAge:方法里面调用-setAge:,导致无限递归。如果你有注意到崩溃时程序的栈,会发现栈里面都是-setAge:クラスグローバル変数 NSMutableArray * _array を追加しました

  • Get メソッド -(NSMutableArray *)array; を追加しました

  • 🎜 Set メソッド-(void)setArray:(NSMutableArray *)array;を追加しました🎜
  • 🎜コードでは属性の指定に @property を使用していませんが、属性の set メソッドと一致するメソッド名が不足しているため、 Dot を使用できます。構文。 🎜 🎜あ🎜 リーリー 🎜B🎜 リーリー 🎜AとBは同等です!コンパイル後、A は B の形式に変換され、B はさらに C の関数呼び出しの形式に変換されます。 🎜 🎜 -setAge: メソッドで -setAge: を呼び出すと、無限再帰が発生します。プログラムがクラッシュしたときにスタックに注目すると、スタックが -setAge: でいっぱいになっていることがわかります。 🎜 🎜この問題を回避したい場合は、クラス変数の代入を直接使用してください🎜 リーリー
    いいねを押す +0
    Peter_Zhu

    詳細な説明は上記の通りで、簡単に言うと:
    OC のドット構文は単なるコンパイラ機能であり、本質はやはりメソッド呼び出しです。

    いいねを押す +0
    小葫芦

    ここではドット構文を使用せず、メンバー変数の前にアンダースコアを入れて区別してください。 _age = 年齢;

    いいねを押す +0
    刘奇

    ここに書いてある @interface は self を追加せずに直接使用できます。
    age = age だけです

    いいねを押す +0
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート
    私たちについて 免責事項 Sitemap
    PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!