#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里面难道不行吗?
大家讲道理2017-04-24 09:15:51
@property(copy) NSMutableArray *array;
このプロパティが追加されると、それは変数のように見えます。実際、コンパイラは単に変数を追加するだけではありません。
<オル>
@property(copy) NSMutableArray *array;
添加了一个类全局变量NSMutableArray * _array
添加了Get方法-(NSMutableArray *)array;
添加了Set方法-(void)setArray:(NSMutableArray *)array;
你的代码中虽然没有使用@property
,指定属性,但是缺命名了一个符合属性的set
方法的方法名,因此,使用时一样可以使用点语法
。
self.age=age;
[self setAge:age];
A、B两者是等效的!编译后,A会被转化成B的形式,而B会进一步转化成C函数调用的形式!
你在-setAge:
方法里面调用-setAge:
,导致无限递归。如果你有注意到崩溃时程序的栈,会发现栈里面都是-setAge:
クラスグローバル変数 NSMutableArray * _array を追加しました
Get メソッド -(NSMutableArray *)array; を追加しました
@property
を使用していませんが、属性の set
メソッドと一致するメソッド名が不足しているため、 < code>Dot を使用できます。構文。 🎜
🎜あ🎜
リーリー
🎜B🎜
リーリー
🎜AとBは同等です!コンパイル後、A は B の形式に変換され、B はさらに C の関数呼び出しの形式に変換されます。 🎜
🎜 -setAge:
メソッドで -setAge:
を呼び出すと、無限再帰が発生します。プログラムがクラッシュしたときにスタックに注目すると、スタックが -setAge:
でいっぱいになっていることがわかります。 🎜
🎜この問題を回避したい場合は、クラス変数の代入を直接使用してください🎜
リーリー