IOS 속성 수정자 assign weak copy

6131 단어

assign


기본 데이터 형식 int float double bool에 대한 약한 인용

weak


약한 참조는 NSObject 객체에 적용되며 weak 코스메틱 객체가 놓인 후에는 포인터 주소가 nil로 설정됩니다.runtime는 등록된 클래스를 레이아웃하고 weak 대상에 대한hash표에 넣습니다.weak가 가리키는 대상의 메모리 주소를 키로 하고, 이 대상의 인용 계수기가 0일 때 dealloc를 사용합니다. weak가 가리키는 대상의 메모리 주소가 a이면 a를 키로 하고, 이 weak표에서 검색하여 a를 키로 하는 모든 weak 대상을 찾고nil로 설정합니다.

copy


NSString NSArray NSDictionary 는 왜 copy 를 자주 사용합니까?코피를 사용하는 목적은 대상의 속성이 외부의 영향을 받지 않도록 하기 위해서이다.만약에 NSMutable Array가 들어왔다면 copy를 사용하면 NSArray가 되어 외부에서 바꿀 수 없습니다.
NSError 는 copy 를 사용합니다. 왜냐하면 copying 프로토콜이 이루어졌기 때문입니다.
이렇게 쓰면 무슨 문제가 있습니까: @property(copy) NSMutable Array *array;
  • 추가, 그룹 내의 요소를 삭제하면 대응하는 방법을 찾지 못해 붕괴됩니다. 왜냐하면 코피는 변할 수 없는 NSArray 대상을 복사했기 때문입니다.
  • tomic 사용은 성능에 심각한 영향을 미친다
  • 깊이 복사 얕은 복사 시스템 비용기 클래스의 변하지 않는 대상에 대한copy 호출 방법은 현재 대상의 바늘을 원래 대상의 주소로 가리키고,mutable Copy 호출 방법은 메모리 영역을 새로 분배하고 새 대상의 바늘을 이 구역으로 가리킨다.가변 대상에 대해 말하자면, 코피와mutableCopy 방법을 호출하면 메모리를 다시 분배하지만, 가변 대상에 대해 코피 방법을 호출하면 가변 대상을 되돌려줍니다.그러나 얕은 복제 대상의 값을 다시 바꾸면 깊은 복사가 된다
    NSString *str = @"123";
    NSString *strCopy = [str copy]; //    
        
    NSLog(@"str = %@    strCopy = %@",str,strCopy);
    NSLog(@"str  :%p    strCopy  :%p",str,strCopy);
    str = @"a"; //            (   )
    NSLog(@"str = %@    strCopy = %@",str,strCopy);
    NSLog(@"str  :%p    strCopy  :%p",str,strCopy);
        
    NSMutableString *mustr = [str copy]; // mustr        
    NSMutableString *muCopy = [str mutableCopy];
    NSLog(@"mustr = %@    muCopy = %@",mustr,muCopy);
    NSLog(@"mustr  :%p     muCopy  :%p",mustr,muCopy);
    [muCopy appendString:@"b"];
    NSLog(@"mustr = %@    muCopy = %@",mustr,muCopy);
    NSLog(@"mustr  :%p     muCopy  :%p",mustr,muCopy);
    
    
    str = 123    strCopy = 123
    str  :0x106ecdc58    strCopy  :0x106ecdc58
    str = a    strCopy = 123
    str  :0x106ecdcb8    strCopy  :0x106ecdc58
    mustr = a    muCopy = a
    mustr  :0x106ecdcb8     muCopy  :0x60000007cc80
    mustr = a    muCopy = ab
    mustr  :0x106ecdcb8     muCopy  :0x60000007cc80
    

    변환할 수 없는 용기 대상에 대한 코피 호출 방법은 원래 대상에 대한 지침에 대한 인용을 증가시켰을 뿐입니다. mutableCopy 호출 방법은 메모리를 다시 분배한 다음 새 대상에 대한 지침을 새 메모리로 가리키는 것입니다.가변 대상에 대해서는 코피를 호출하든지mutable Copy를 호출하든지 메모리를 새로 분배합니다.그러나 메모리를 다시 분배했지만 대상 안의 데이터는 여전히 바늘값이다.
    NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"1"],@"2",@"3", nil];
        
    NSArray *arrayCopy = [array copy];
    NSArray *arrayMutableCopy = [array mutableCopy];
    NSLog(@"array  :%p     arrayCopy  :%p      arrayMutableCopy  :%p",array,arrayCopy,arrayMutableCopy);
    NSLog(@"array = %@   arrayCopy = %@    arrayMutableCopy = %@",array,arrayCopy,arrayMutableCopy);
        
    NSMutableArray *mutableArrayCopy = [array copy];
    NSMutableArray *mutableArrayMutableCopy = [array mutableCopy];
    NSLog(@"array  :%p   mutableArrayCopy  :%p    mutableArrayMutableCopy  :%p",array,mutableArrayCopy,mutableArrayMutableCopy);
    NSLog(@"array = %@   mutableArrayCopy =  %@    mutableArrayCopy =  %@",array,mutableArrayCopy,mutableArrayMutableCopy);
        
    NSMutableString *mustr = array[0];
    [mustr appendString:@"2"];
    NSLog(@"array  %p     arrayCopy  %p      arrayMutableCopy  %p     mutableArrayCopy  %p    mutableArrayCopy  %p",array,arrayCopy,arrayMutableCopy,mutableArrayCopy,mutableArrayMutableCopy);
    NSLog(@"array = %@   arrayCopy = %@    arrayMutableCopy = %@   mutableArrayCopy =  %@    mutableArrayCopy =  %@",array,arrayCopy,arrayMutableCopy,mutableArrayCopy,mutableArrayMutableCopy);
    
    
    array  :0x6080000538f0     arrayCopy  :0x6080000538f0      arrayMutableCopy  :0x608000050d70
    array = (
        1,
        2,
        3
    )   
    arrayCopy = (
        1,
        2,
        3
    )    
    arrayMutableCopy = (
        1,
        2,
        3
    )
    array  :0x6080000538f0   mutableArrayCopy  :0x6080000538f0    mutableArrayMutableCopy  :0x608000050890
    array = (
        1,
        2,
        3
    )   
    mutableArrayCopy =  (
        1,
        2,
        3
    )    
    mutableArrayCopy =  (
        1,
        2,
        3
    )
    array  0x6080000538f0     arrayCopy  0x6080000538f0      arrayMutableCopy  0x608000050d70     mutableArrayCopy  0x6080000538f0    mutableArrayCopy  0x608000050890
    array = (
        12,
        2,
        3
    )   
    arrayCopy = (
        12,
        2,
        3
    )    
    arrayMutableCopy = (
        12,
        2,
        3
    )   
    mutableArrayCopy =  (
        12,
        2,
        3
    )    
    mutableArrayCopy =  (
        12,
        2,
        3
    )
    

    원래 그룹의 값을 변경한 후에 모든 새 그룹의 값이 변경되었음을 알 수 있습니다. Mutable Copy 방법을 사용해서 만든 새 그룹의 값도 변경되었기 때문에 시스템 용기 클래스의 대상에 대해 요소 대상은 항상 바늘로 복사되었음을 알 수 있습니다.
    사용자 정의 클래스에 NSCopying 프로토콜이 기본적으로 적용되지 않음
    Person *p1 = [[Person alloc] init];
    Person *p2 = [p1 copy]; //  
    
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Person copyWithZone:]: unrecognized selector sent to instance 0x608000011570'
    

    property


    @property = ivar(인스턴스 변수) + Getter + setter
    @implementation Book
    @dynamic  name;
    @synthesize age = _age;
    

    @synthesize 컴파일러가 자동으로 Getter/setter 방법을 생성합니다. 사용자 정의 접근 방법이 있을 때 자동으로 생성되지 않습니다.
    @dynamic 컴파일러가 자동으로 Getter/setter를 생성하지 않는 방법을 알려줍니다
    protocol에서 @property를 사용하면 setter getter 방법만 생성할 수 있습니다. 프로토콜을 준수하는 대상이 이 속성 방법을 실현하기를 희망합니다. setter와 getter를 동시에 다시 썼을 때 시스템에서ivar을 생성하지 않습니다.해결 방법은 다음과 같은 두 가지가 있다
    @interface ViewController () {
        // NSString *_name;   1:    ivar
    }
    @property (nonatomic, strong) NSString *name;
    @end
    
    @implementation ViewController
    //@synthesize name = _name;   2:  @sysnthesize  @property  ivar
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (NSString *)name{
        //return _name;
    }
    
    - (void)setName:(NSString *)name{
        //_name = @"";
    }
    
    @end
    

    set get

    - (void)setName:(NSString *)name{
        if (_name != name) {
            [name retain];
            [_name release];
            _name = name;
        }
    }
    
    self.name = @"dog"; //    setter
    NSLog(@"%@",self.name); //    getter
    
    _name = @"cat"; //       
    NSLog(@"%@",_name); //       
    

    좋은 웹페이지 즐겨찾기