>  Q&A  >  본문

objective-c - 为什么这一段Objectc会报错?



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

阿神阿神2709일 전689

모든 응답(4)나는 대답할 것이다

  • 大家讲道理

    大家讲道理2017-04-24 09:15:51

    objective-c에서는 속성을 단순 할당 및 값 연산으로 호출하지만 실제로는 속성의 사용이 메소드 호출입니다!

    예:

    @property(copy) NSMutableArray *array;
    이 속성이 추가되면 실제로 변수처럼 보입니다. 컴파일러는 단순히 변수를 추가하는 것 이상의 작업을 수행합니다.

    1. 클래스 전역 변수 NSMutableArray * _array 추가

    2. Get 메서드 추가-(NSMutableArray *)배열;

    3. Set 메소드 추가-(void)setArray:(NSMutableArray *)array;

    귀하의 코드는 속성을 지정하기 위해 @property을 사용하지 않지만 속성의 set 메서드와 일치하는 메서드 이름이 부족하므로 이를 사용할 때 点语法을 계속 사용할 수 있습니다.

    으아아아

    으아아아

    A와 B는 동일합니다! 컴파일 후 A는 B의 형태로 변환되고, B는 추가적으로 C 함수 호출의 형태로 변환됩니다!

    -setAge: 메서드에서 -setAge:을 호출하면 무한 재귀가 발생합니다. 프로그램이 충돌할 때 스택을 보면 스택이 -setAge:로 가득 차 있는 것을 알 수 있습니다.

    이 문제를 피하려면 클래스 변수 할당을 직접 사용하세요

    으아아아

    회신하다
    0
  • 天蓬老师

    天蓬老师2017-04-24 09:15:51

    자세한 설명은 위에서 언급한 바와 같습니다.
    OC의 도트 구문은 단지 컴파일러 기능일 뿐이며 본질은 여전히 ​​메소드 호출입니다.

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-24 09:15:51

    여기에서는 점 구문을 사용하지 말고, 멤버 변수 앞에 밑줄을 넣어 구분하세요. _age = 나이;

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-24 09:15:51

    여기에 적힌 @interface는 본인 추가 없이 바로 사용 가능합니다.
    그냥 나이=나이

    회신하다
    0
  • 취소회신하다