ios copy 관련
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.