OC 언어-08-심층 복사 및 얕은 복사 상해(예)
개술
Copy 및 Retain
다른 객체의 복제 동작
NSString
)- (void)imutableInstanceCopy
{
NSString *string = @"Welcome to Xcode";
//copy,
NSString *stringCopy = [string copy];
//mutableCopy,
NSMutableString *stringMutableCopy = [string mutableCopy];
[stringMutableCopy appendString:@"!"];
//string stringCopy
NSLog(@"string: %p", string);
NSLog(@"strongCopy: %p", stringCopy);
//string stringMutableCopy ,
NSLog(@"stringMCopy:%p", stringMutableCopy);
}
- (void)mutableInstanceCopy
{
NSMutableString *mutableString = [NSMutableString stringWithString: @"Welcome to Xcode"];
// ,
NSString *stringCopy = [mutableString copy];
NSMutableString *mutableStringCopy = [mutableString copy];
// , , “Attempt to mutate immutable object with appendString:”
[mutableStringCopy appendString:@"~~~"];
// ,
NSMutableString *stringMutableCopy = [mutableString mutableCopy];
[stringMutableCopy appendString:@"!"];
// mutableString
NSLog(@"mutableString: %p", mutableString);
NSLog(@"string: %p", stringCopy);
NSLog(@"mutableStringCopy: %p", mutableStringCopy);
NSLog(@"stringMutbleCopy:%p", stringMutableCopy);
}
NSArray
- (void)containerInstanceShallowCopy
{
NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"Welcome"],@"to",@"Xcode",nil];
//
NSArray *arrayCopy = [array copy];
//
NSMutableArray *arrayMutableCopy = [array mutableCopy];
NSLog(@"array: %p", array);
NSLog(@"arrayCopy: %p", arrayCopy);
NSLog(@"arrayMutableCopy: %p", arrayMutableCopy);
// ,
NSMutableString *testString = [array objectAtIndex:0];
[testString appendString:@" you"];
//
NSLog(@"array[0]: %@", array[0]);
NSLog(@"arrayCopy[0]: %@", arrayCopy[0]);
NSLog(@"arrayMutableCopy[0]: %@", arrayMutableCopy[0]);
}
- (void)containerInstanceDeepCopy
{
NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"Welcome"],@"to",@"Xcode",nil];
//
NSArray *deepCopyArray = [[NSArray alloc] initWithArray:array];
// ,
NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:array]];
NSLog(@"array: %p", array);
NSLog(@"deepCopyArray: %p", deepCopyArray);
NSLog(@"trueDeepCopyArray: %p", trueDeepCopyArray);
// array
[[array objectAtIndex:0] appendString:@" you"];
// deepCopyArray
NSLog(@"array[0]: %@", array[0]);
NSLog(@"arrayCopy[0]: %@", deepCopyArray[0]);
// trueDeepCopyArray ,
NSLog(@"arrayMutableCopy[0]: %@", trueDeepCopyArray[0]);
}
@interface Person : NSObject <NSCopying, NSMutableCopying>
/** */
@property (nonatomic, copy) NSMutableString *name;
/** */
@property (nonatomic, copy) NSString *address;
/** */
@property (nonatomic, assign) NSInteger age;
@end
- (instancetype)init
{
if (self = [super init])
{
self.name = [[NSMutableString alloc] initWithString:@"XiaoYaowang"];
self.address = @" ";
self.age = 3;
}
return self;
}
- (id)copyWithZone:(NSZone *)zone
{
Person *p = [[[self class] allocWithZone:zone] init];
p.name = [self.name copy];
p.address = [self.address copy];
p.age = self.age;
return p;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
Person *p = [[[self class] allocWithZone:zone] init];
// , mutableCopy
p.name = [self.name mutableCopy];
p.address = [self.address copy];
p.age = self.age;
return p;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.