ios copy 관련

3100 단어

ios 깊이 복사의 차이


심층 복사: 대상을 복사하면 새로운 대상이 생기고 인용 계수 +1;얕은 복사: 바늘 복사로 새로운 대상이 생기지 않고 인용 계수가 변하지 않습니다.심도 복사의 판단 근거: A:원래 변수와 복사된 변수가 같은 메모리 주소인지 확인;B:또는 원래 변수와 복사 변수 중 하나와 관련된 속성 값을 바꾸고 다른 변수에 변화가 발생하는지 확인한다.

시스템 원본 대상의 깊이와 얕은 복사의 차이


1. NSObject 클래스는 copy와mutableCopy 방법을 제공하는데 이 두 가지 방법을 통해 기존 대상의 복사본을 복사할 수 있다.2. 시스템 원시 대상: NSString과 NSMutableString, NSArray와 NSMutableArray, NSDictionary와 NDMutableDictionary, NSSet과 NSMutableSet 등이다. 이런 대상은 모두 NSCopying을 따랐고 NSMutableCopying 프로토콜인 NSValue, NSNumber는 NSCopying 프로토콜만 따랐다.3. 변하지 않는 유형은copy를 통과한 후 얕은 복사,mutableCopy를 통과한 후 깊은 복사입니다.가변 유형은copy와mutableCopy를 통과한 후 깊이 복사됩니다.가변 유형이든 불변 유형이든 코피 이후에는 불변 유형이다.

객체 복제본 사용자 정의


실제 개발에서도 우리는 사용자 정의 대상 복사를 자주 사용한다.사용자 정의 대상을 copy하고 대상은 반드시 copy와 관련된 프로토콜(NSCopying 또는 NSMutable Copy)을 실현해야 한다. 그렇지 않으면 오류가 발생할 수 있다.예: - [Person copy WithZone:]: unrecognized selector sent to instance 0x1c4030900
copy 사례: 사용자 정의 Person 클래스에 name, age, dog 속성이 있음

@interface Dog : NSObject
@property(nonatomic,copy)NSString *color;
@end


@interface Person : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *age;

@property(nonatomic,strong)Dog *dog;

@end


상기 코드인 Person 클래스는 copy 기능을 갖추지 않아서 우리가 copy 방법을 사용하면 오류가 발생합니다. [Person copy WithZone:]: unrecognized selector sent to instance 0x1c4030900;
Person이 copy 기능을 갖추려면 NSCopying 프로토콜을 따르고 이 프로토콜을 실현해야 한다.
#import "Person.h"

@implementation Person

- (nonnull id)copyWithZone:(nullable NSZone *)zone {
   
    Person *per = [[[self class] allocWithZone:zone]init];
    per.name = self.name;
    per.age = self.age;
    
    //dog      ,              ,
    //                 dog
    //        , Dog    copy         per.dog = [self.dog copy];
//    per.dog = self.dog;
    
    Dog *dog = [[Dog alloc]init];
    dog.color = self.dog.color;
    self.dog = dog;
   
    return per;
}
@end

총괄적으로 말하면 하나의 자정 대상이 복사 기능을 가지도록 하려면 이 대상은 반드시 NSCopying 프로토콜이나 NSMutableCopying 프로토콜을 실현해야 한다.대상이 copy나mutableCopy 방법을 호출할 때 프로토콜의 방법을 터치합니다
@protocol NSCopying

- (id)copyWithZone:(nullable NSZone *)zone;

@end

@protocol NSMutableCopying

- (id)mutableCopyWithZone:(nullable NSZone *)zone;

@end

코피를 검증하는 일반적인 방법


원 대상 주소와copy 이후의 대상 주소를 비교하다
   //           ,            
 //   
    NSArray *arr = [NSArray array];
    NSMutableArray *mut = [NSMutableArray array];
    
 //    
    NSArray *copyArr = arr.copy; //      copy
    NSLog(@"arr:%p--copyArr:%p",arr,copyArr); //          
    
    NSArray *mutcopyArr = arr.mutableCopy;//      mutableCopy
    NSLog(@"arr:%p--mutcopyArr:%p",arr,mutcopyArr); //          
    
   
    NSMutableArray *copyMut = mut.copy; //     copy
    NSLog(@"mut:%p--copyMut:%p",mut,copyMut);//          
    
    NSMutableArray *mutableCopyMut = mut.mutableCopy; //     mutableCopy
    NSLog(@"mut:%p--mutableCopyMut:%p",mut,mutableCopyMut);//          
    

Demo

좋은 웹페이지 즐겨찾기