문자열을 copy로 꾸미기

3335 단어

속성 수정자:

    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의 결과를 보여 드리겠습니다.
  • 스트롱으로 NSString 객체 손질
  • viewDidLoad에서 빈 가변 문자열을 실례화
  • 가변 문자열에 내용 추가
  • 스트롱 코스메틱 NSString 객체가 가변 문자열 객체
  • 를 가리킵니다.
  • 가변 문자열에 계속 내용 추가
  • 스트롱 코스메틱 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을 사용하는 것이 좋다

    좋은 웹페이지 즐겨찾기