03OC의 클래스 보충

5703 단어
지난 장에서 우리는 클래스의 정의, 그리고 클래스 안에서 구성원 변수를 어떻게 정의하는지, 방법을 어떻게 정의하는지 등을 소개했다.

키워드


1. C#에 키워드this가 현재 대상을 나타내는데 사실 OC에도 비슷한 키워드self가 있다. 단지self키워드는 현재 대상을 나타낼 뿐만 아니라 클래스 자체도 나타낼 수 있다. 즉, 정적 방법에도 넣을 수 있고 동적 방법에도 사용할 수 있다.
#import "Person.h"

@implementation Person
-(void)setName:(NSString *)name andAge:(int)age{
//    _name=name;
//    _age=age;
    self.name=name;
    self.age=age;
}

+(void)printInfo{
    NSLog(@"Hello,World!");
}

+(void)showMessage{
    [self printInfo];
}
@end

그리고 호출할 때를 보세요.
#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {

    Person *p=[[Person alloc]init];
    [p setName:@"Kenshin" andAge:28];
    [Person showMessage];
    
    return 0;
}

그 중에서 setNameandAge는 동적 방법으로 이때self는 p라는 대상을 나타내고 showMessage는 호출된 클래스를 대표하기 때문에self는 현재 방법의 호출자이다.
self에 대한 주의 사항:
#import "Person.h"

@implementation Person

-(void)setName:(NSString *)name{
    self.name=name;
}

이것은 속성을 실현하는 코드,self.name=name;사실은 self를 호출하는 거예요.setName=name;이렇게 하면 사순환을 일으킬 것이다.그래서 @property에서 자동으로 생성된 속성을 사용하지 않았을 때 구성원 변수를 정의할 때 밑줄을 긋습니다.(name 좋은 습관)

2. 구조 함수


앞에서 우리가 클래스를 만드는 대상은 초기화할 때 init 방법(구조 함수)을 호출해야 한다. 다음은 사용자 정의 구조 함수를 좋아하는 것을 살펴보자.
구현 코드:
// 
-(id)initWithName:(NSString *)name andAge:(int)age{
    if(self=[super init]){ //super 
        self.name=name;
        self.age=age;
    }
    return self;
}

OC에서 슈퍼는 부류를 대표하며 부류를 호출하는 방법으로 현재 대상에게 값을 부여한 다음에 이 대상이nil인지 아닌지를 판단하고 비어 있지 않으면name,age 속성에 순차적으로 값을 부여한다.
어떻게 호출하는지 보십시오:
int main(int argc, const char * argv[]) {
   Person *p=[[Person alloc]initWithName:@"Kenshin" andAge:28]; NSLog(@"name=%@,age=%i",p.name,p.age); // :name=Kenshin,age=28 return 0; }

사용자 정의 구조 방법을 통해 코드를 간소화할 수 있지만 사용할 때 수동으로 메모리를 신청해야 한다. OC에서 일반적으로 우리는 정적 방법을 정의하여 이 문제를 해결한다.
// 
+(id)personWithName:(NSString *)name andAge:(int)age{
    Person *p=[[Person alloc]initWithName:name andAge:age];
    return p;
}
int main(int argc, const char * argv[]) {
    
    Person *p=[[Person alloc]initWithName:@"Kenshin" andAge:28];
    NSLog(@"name=%@,age=%i",p.name,p.age);
    // :name=Kenshin,age=28
    
    Person *p2=[Person personWithName:@"Kaoru" andAge:27];
    NSLog(@"name=%@,age=%i",p2.name,p2.age);
    // :name=Kaoru,age=27
    return 0;
}

3. description 방법


C# 모든 클래스에는 대상의 정보를 인쇄하는 데 사용되는 Tostring () 방법이 있습니다. OC에서는 이 방법을 description이라고 합니다. 예를 들어 앞의 Person 클래스에서 우리는 이 방법을 다시 써서 인쇄 디버깅에 사용할 수 있습니다.
@implementation Person
-(NSString *)description{
    return [NSString stringWithFormat:@"{name:%@,age:%i}",self.name,self.age];
}
int main(int argc, const char * argv[]) {
    Person *p=[[Person alloc]init];
    p.name=@"Kenshin";
    p.age=28;
    NSLog(@"%@",p);// description 
    /* :
     name:Kenshin,age:28}
     */
    return 0;
}

NSLog의 형식 문자가%@인 것을 주의하십시오.%@을 사용하여 대상을 출력할 때 OC는 이 대상의 description을 호출하여 출력합니다. 기본적으로 description 방법을 다시 쓰지 않을 때 출력 내용은 <클래스: 주소 > 예를 들어 ""descripton에서 출력self를 출력하지 마십시오. 출력self를 출력할 때 이 대상의 descripton 방법을 호출하기 때문입니다.이렇게 되면 사순환을 일으킨다.

상속


OC는 대상 언어이기 때문에 당연히 계승을 지원하지만 사실 우리의 Persion은 NSObject를 계승했다.하위 클래스는 부모 클래스의 방법과 속성을 다시 쓸 수 있습니다.자세히 말하지 않다.
 

좋은 웹페이지 즐겨찾기