OC에서 porperty copy와 strong 비교

2926 단어
선언: 처음으로 위에서 글을 썼는데, 여전히 매우 흥분되었다.앞으로 자신이 배운 것, 글에 오류가 있거나 조언이 있으면 댓글을 달아주세요.공부는 끝이 없으니, 학습의 길에서 모두 함께 격려하기를 바랍니다!
본고는 주로 iOS 개발에서 NSString 속성이 copy로 수식되었는지strong으로 수식되었는지의 문제를 토론하고자 한다. 토론하기 전에 심도 있는 복사와 얕은 복사를 먼저 이해해야 한다.

깊이 복사와 얕은 복사

  • 간단한 복사
  • 정의: 원 대상과 던전 대상은 같은 대상
  • 본질: 새로운 대상이 생기지 않았음
  • NSString *str = @"kris";
    NSString *strCopy = [str copy];
    NSLog(@"str :%p, strCopy :%p", str, strCopy);
    
    // : str1 :0x100001030, str2 :0x100001030
    
  • 딥 카피
  • 정의: 원 대상과 던전 대상은 같은 대상이 아니다
  • 본질: 새로운 대상이 생겼다
  • NSString *str = @"kris";
    NSMutableString *strCopy = [str mutableCopy];
    NSLog(@"str = %p, strCopy = %p", str, strCopy);
    
    // : str = 0x100001030, strCopy = 0x100b00580
    
  • 요약: 원본과 사본의 대상이 모두 변할 수 없을 때 얕은 복사이고 나머지는 깊은 복사이다.
  • 예를 들어 NSString의 경우 원래 대상과 던전 대상이 모두 NSString일 때 얕은 복사이고 다른 상황은 모두 깊은 복사이다

  • copy와 mutableCopy의 차이점

  • copy:copy를 사용한 후의 대상은 모두 변할 수 없는 대상
  • mutableCopy:mutableCopy를 사용한 대상은 모두 변할 수 있는 대상
  • 원대상
    수식자(방법)
    객체 복사
    NSString
    copy
    NSString
    mutableCopy
    NSMutableString
    NSMutableString
    copy
    NSString
    mutableCopy
    NSMutableString

    질문


    우선 두 가지 수식의 효과를 보도록 하겠습니다.
  • 새 Person 클래스를 만듭니다. .h 파일에서property로 속성 name
  • main 함수 중의 방법은
  • Person *p = [[Person alloc] init];
    NSMutableString *str = [NSMutableString stringWithFormat:@"kris"];
    p.name = str;
    // str 
    [str appendString:@"_itdog"];
    NSLog(@"p.name = %@, str = %@", p.name, str);
    

    코포로 꾸미다

  • Person.h 파일의 name 속성:
  • @property (nonatomic, copy) NSString *name;
    
  • 실행 결과
  • p.name = kris, str = kris_itdog
    

    strong 코스메틱 사용

  • Person.h 파일의 name 속성:
  • @property (nonatomic, strong) NSString *name;
    
  • 실행 결과
  • p.name = kris_itdog, str = kris_itdog
    

    copy 구현 원리

  • property로 성명한 속성은 자동으로 .m 파일에서 Getter/setter 방법을 생성하고,copy로 수식하는 것은 사실 속성의 setter 방법으로 값을 부여할 때copy 방법을 사용한다. 코드는 다음과 같다:
  • - (void)setName:(NSString *)name
    {
        _name = [name copy];
    }
    

    총결산

  • 애플은 일반적으로 개발자에게 코피 수식 NSString을 사용하여 외부가 가변 문자열일 때 외부의 값을 수정하면 속성의 값에 영향을 미치는 것을 방지하는 것을 추천한다
  • 주: 외부에서 변하지 않는 문자열이면 영향을 주지 않습니다
  • copy로 속성을 수식하는 것은 사실 속성을 다시 쓰는 setter 방법이고 바깥의 값을 속성에 복사하는 것은 깊이 복사
  • 이다.

    참고:

  • 일상적인 개발에서 우리가 받은 데이터는 일반적으로 인터넷에서 얻을 수 있고 얻은 값은 사전이며 변할 수 없는 값이기 때문에 개발에서 일반적으로 strong로 NSString을 수식한다. 만약에 copy로 수식하면 매번 내부에서 copy 방법을 호출하기 때문에 데이터가 많을 때 매번 copy 방법을 호출하여 성능에 영향을 줄 수 있기 때문에 strong으로 일정한 성능을 향상시킬 수 있다
  • 좋은 웹페이지 즐겨찾기