#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;
這個屬性加以後,用起來好像是變量,其實編譯器做的不只是加了一個變數:
新增了一個類別全域變數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:
。
想要避免這個問題,就直接使用類別變數賦值
_age = age;