iOS는 어떻게 사용자 정의 클래스의 심층 복사를 실현합니까?
OC 방법:
CustomModel *m1 = [CustomModel new];
m1.name = @"Shaw";
m1.age = 27;
CustomModel *m2 = [m1 copy];
m2.name = @"CTT";
m2.age = 28;
NSLog(@"%@&%@", m1.name, m2.name);
// :Shaw&CTT
@interface CustomModel : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) int age;
@end
@implementation CustomModel
- (id)copyWithZone:(NSZone *)zone {
CustomModel *copy = [[[self class] alloc] init];
unsigned int propertyCount = 0;
objc_property_t *propertyList = class_copyPropertyList([self class], &propertyCount);
for (int i = 0; i < propertyCount; i++ ) {
objc_property_t thisProperty = propertyList[i];
const char* propertyCName = property_getName(thisProperty);
NSString *propertyName = [NSString stringWithCString:propertyCName encoding:NSUTF8StringEncoding];
id value = [self valueForKey:propertyName];
[copy setValue:value forKey:propertyName];
}
return copy;
}
// , Runtime , hash ,
- (void)setValue:(id)value forUndefinedKey:(NSString *)key {}
Swift 방식:
NSObject에 확장자를 써서 NSCopying 프로토콜을 준수하도록 합니다. 또한 사용자 정의 클래스도 setValueForUndefinedKey 함수를 실현해야 합니다.
let m1 = CustomModel()
m1.name = "Shaw"
m1.age = 27
let m2 = m1.copy() as! CustomModel
m2.name = "CTT"
m2.age = 28
print("\(m1.age!)&\(m2.age!)")
// :27&28
class CustomModel: NSObject {
public var name: String?
public var age: Int?
override func setValue(_ value: Any?, forUndefinedKey key: String) {}
}
extension NSObject: NSCopying {
public func copy(with zone: NSZone? = nil) -> Any {
let copy = self.classForCoder.alloc()
let mirror = Mirror(reflecting: self)
for (label, value) in mirror.children {
guard let label = label else { continue }
copy.setValue(value, forKey: label)
}
return copy
}
}
만약 부류가 깊은 복사를 실현했다면, 하류는 어떻게 깊은 복사를 실현합니까?만약 부모 클래스가 깊은 복사를 실현하지 못한다면, 하위 클래스는 어떻게 실현합니까?
부모 클래스가 깊은 복사를 실현한 후 하위 클래스는copyWithZone 방법을 다시 쓰고 방법 내부에서 부모 클래스의copyWithZone 방법을 호출한 후에 자신의 속성 처리를 실현한다.부류가 깊은 복사를 실현하지 못했기 때문에 부류는 자신의 속성을 처리해야 할 뿐만 아니라 부류의 속성도 처리해야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.