Objective-C에서 객체를 복사하는 방법
자체적으로 소유 한 사용자 정의 객체를 딥 카피해야합니다. 나는 주변을 읽고 NSCopying을 상속하는 방법과 NSCopyObject를 사용하는 방법에 대해 혼란 스럽습니다.
항상 참조 유형과 "복사"라는 두 가지 개념이 있습니다. 나는 당신이 요구할 것이라고 확신합니다.
- 비트 사본. 여기서는 비트에 대한 메모리 비트를 복사합니다. 이것은 NSCopyObject의 기능입니다. 거의 항상 당신이 원하는 것이 아닙니다. 객체는 내부 상태, 다른 객체 등을 보유하고있는 데이터에 대한 참조를 보유한 유일한 객체라고 가정합니다. 비트 단위 복사본은이 가정을 위반합니다.
- 깊고 위치 인 사본. 여기서 우리는 객체의 복사본을 만들지 만 실제로는 조금씩하지 않고 모든 의도와 목적에 동일하게 작동하지만 Objective C 매뉴얼은 객체를 원래 "기능적으로 독립된"것으로 호출합니다. 다만 "지능형"복사본을 만드는자는 클래스마다 다르지만 자체에서 수행하도록 요청합니다. 이것이 NSCopying 프로토콜입니다.
당신은 후 튼튼합니다. 이것이 자신의 수업 중 하나 인 경우 NSCopying 프로토콜을 채택하고-(id) copyWithZone : (NSZone *) zone을 구현합니다. 원하는 것은 무엇이든 자유롭게 할 수 있습니다. 아이디어는 당신이 당신 자신의 실제 사본을 만들어 돌려주는 것입니다. 모든 필드에서 copyWithZone을 호출하여 딥 카피를 만듭니다. 간단한 예는
@interface YourClass : NSObject <NSCopying>
{
SomeOtherObject *obj;
}
// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
// We'll ignore the zone for now
YourClass *another = [[YourClass alloc] init];
another.obj = [obj copyWithZone: zone];
return another;
}
애플 문서에 따르면
copyWithZone : 메소드의 서브 클래스 버전은 서브 클래스가 NSObject에서 직접 내려 오지 않는 한, 구현을 통합하기 위해 먼저 슈퍼로 메시지를 보내야합니다.
기존 답변에 추가
@interface YourClass : NSObject <NSCopying>
{
SomeOtherObject *obj;
}
// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
YourClass *another = [super copyWithZone:zone];
another.obj = [obj copyWithZone: zone];
return another;
}
코드와 내 코드의 차이점을 모르지만 해당 솔루션에 문제가 있기 때문에 조금 더 읽고 있다는 것을 반환하기 전에 있습니다. 나는 다음과 같은 것을 의미한다 :
#import <Foundation/Foundation.h>
@interface YourObject : NSObject <NSCopying>
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *line;
@property (strong, nonatomic) NSMutableString *tags;
@property (strong, nonatomic) NSString *htmlSource;
@property (strong, nonatomic) NSMutableString *obj;
-(id) copyWithZone: (NSZone *) zone;
@end
@implementation YourObject
-(id) copyWithZone: (NSZone *) zone
{
YourObject *copy = [[YourObject allocWithZone: zone] init];
[copy setNombre: self.name];
[copy setLinea: self.line];
[copy setTags: self.tags];
[copy setHtmlSource: self.htmlSource];
return copy;
}
이 문제에 많은 문제가 있고 왜 발생하는지에 대한 단서가 없기 때문에이 답변을 추가했습니다. 나는 그 차이를 모르지만 그것은 나를 위해 일하고 어쩌면 다른 사람들에게도 유용 할 수 있습니다 :)
another.obj = [obj copyWithZone: zone];
이 줄 obj
은 (내가 가정) 선언 된 속성 을 통해 액세스하기 때문에 메모리 누수가 발생 한다고 생각 retain
합니다. 따라서 보유 횟수 는 속성 및 copyWithZone
.
다음과 같아야한다고 생각합니다.
another.obj = [[obj copyWithZone: zone] autorelease];
또는:
SomeOtherObject *temp = [obj copyWithZone: zone];
another.obj = temp;
[temp release];
복사를 위해-> 연산자를 사용할 수도 있습니다. 예를 들면 :
-(id)copyWithZone:(NSZone*)zone
{
MYClass* copy = [MYClass new];
copy->_property1 = self->_property1;
...
copy->_propertyN = self->_propertyN;
return copy;
}
여기서 이유는 복사 된 객체가 원본 객체의 상태를 반영해야하기 때문입니다. "." 연산자는 논리를 포함 할 수있는 getter를 호출하므로 부작용이 발생할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/1459598/how-to-copy-an-object-in-objective-c
'IT' 카테고리의 다른 글
시간을 변경하지 않고 C # DateTime을 UTC 시간으로 (0) | 2020.08.03 |
---|---|
MongoDB와 Mongoose의 차이점 (0) | 2020.08.03 |
CoffeeScript를 사용하여 객체에 키가 있는지 확인하는 가장 간단한 방법 (0) | 2020.08.03 |
확장 메소드는 동적으로 디스패치 할 수 없습니다 (0) | 2020.08.03 |
C # String.Format () 및 String.Join ()에 해당하는 Java (0) | 2020.08.03 |