#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 *)배열;
Set 메소드 추가-(void)setArray:(NSMutableArray *)array;
귀하의 코드는 속성을 지정하기 위해 @property
을 사용하지 않지만 속성의 set
메서드와 일치하는 메서드 이름이 부족하므로 이를 사용할 때 点语法
을 계속 사용할 수 있습니다.
A와 B는 동일합니다! 컴파일 후 A는 B의 형태로 변환되고, B는 추가적으로 C 함수 호출의 형태로 변환됩니다!
-setAge:
메서드에서 -setAge:
을 호출하면 무한 재귀가 발생합니다. 프로그램이 충돌할 때 스택을 보면 스택이 -setAge:
로 가득 차 있는 것을 알 수 있습니다.
이 문제를 피하려면 클래스 변수 할당을 직접 사용하세요
으아아아天蓬老师2017-04-24 09:15:51
자세한 설명은 위에서 언급한 바와 같습니다.
OC의 도트 구문은 단지 컴파일러 기능일 뿐이며 본질은 여전히 메소드 호출입니다.