문자열을 copy로 꾸미기
속성 수정자:
MRC:
assign: ( , assign)
retain: Block NSString
copy: NSString Block
ARC:
strong:
weak: ui
copy: NSString Block
assign: OC
NSString이 OC 대상에 속하는 이상 Copy 수식을 사용하지 않겠습니다. ARC 모드에서 성명된 속성은 기본적으로 strong 수식이고 그 다음에 strong 수식 NSString의 결과를 보여 드리겠습니다.
#import "ViewController.h"
@interface ViewController ()
/* copy ?
copy ,NSString OC , ARC , strong
*/
@property (nonatomic,strong) NSString *name;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString *str = [NSMutableString string];
[str appendString:@"xiaoming"];
self.name = str;
[str appendString:@"xiaogang"];
NSLog(@"%@",_name);
}
@end
결과는 다음과 같습니다.
2016-07-31 13:51:35.218 copy [9376:241671] xiaomingxiaogang
결과 분석: strong을 사용하여 NSString 유형 속성 self를 수정하는 경우name는 가변 문자열 대상의 주소를 가리키며 가변 문자열의 내용이 변할 때self.name
copy 수식을 사용한 후, 가변 문자열을 다시 복사하고, 메모리 공간을 다시 열고,mutableString의 값을 수정합니다.self에 대한 값을 수정하지 않습니다.name 영향
2016-07-31 14:22:00.070 copy [9548:269772] str:0x7fa871488750,name:0xa006412031812da8
2016-07-31 14:22:00.074 copy [9548:269772] str:0x7fa871488750,name:0xa006412031812da8
2016-07-31 14:22:00.074 copy [9548:269772] xiaoming
방금 설명한 바와 같이 저는 NSMutable String(가변 문자열)을 사용하여mutable String에 대해 복사 작업을 수행했습니다. 깊은 복사에 속하기 때문에 새로운 메모리 공간을 개척했습니다. 만약에 NSString(가변 메모리)을 사용한다면 NSString에 대한 복사는 얕은 복사에 속하고 새로운 메모리 공간을 개척하지 않을 것입니다. 이런 문제가 발생하지 않을 것입니다.
그런 다음 NSString을 사용하여 속성 수정자를 다시 strong으로 바꿉니다.
#import "ViewController.h"
@interface ViewController ()
/* copy ?
copy ,NSString OC , ARC , strong
*/
@property (nonatomic,strong) NSString *name;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *str = [NSString string];
str = @"xiaoming";
self.name = str;
NSLog(@"str:%p,name:%p",str,_name);
str = @"xiaogang";
NSLog(@"str:%p,name:%p",str,_name);
NSLog(@"%@",_name);
}
@end
인쇄 결과:
2016-07-31 14:17:19.127 copy [9499:264651] str:0x10c937060,name:0x10c937060
2016-07-31 14:17:19.128 copy [9499:264651] str:0x10c9370a0,name:0x10c937060
2016-07-31 14:17:19.128 copy [9499:264651] xiaoming
결과적으로str의 값을 다시 설정한 후self.name 영향 받지 않음
원인: 이전의 가변 문자열을 가변 문자열로 변경합니다. NSMutable String은 append 추가 작업을 지원하지 않기 때문입니다. 제가 여기 있는 두 번의str 값 부여 작업은 사실str가 메모리 공간을 다시 가리키게 했습니다.str의 원래 메모리에 있는 값을 수정한 것이 아니다(OC의 대상은 바늘이고 실제로는 메모리 주소를 저장한다.self.name =str; 실제는str가 저장한 @"xiaoming"이란 주소를 self.name에게 주었고,self.name는 @"xiaoming"을 가리킨다) 그래서str의 방향을 바꾼 후,self.name의 지향이 바뀌지 않았습니다. 출력에 영향을 받지 않았습니다.
결론
NSString 대상에 값을 부여할 때, 원본이 NSMutableString이라면, 이 경우는copy를 사용해야 한다는 것을 명심하십시오.만약 원본이 변할 수 없는 형식이라고 확신한다면, 예를 들어
@"http://www.jianshu.com/users/691d9ed740cf/latest_articles"
이런 고정된 문자열을 사용하면strong을 사용하는 것이 좋다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.