[Object-C]_[초급][object 클래스의 객체 및 속성 @property]

13363 단어 언어 특성

장면

  • object-c의 @property는 우리가 자주 사용하는 성명입니다. 속성 유형에 대한 설명은readonly,readwrite,assign,copy,retain,atomic,nonatomic,strong,weak와 관련이 있습니다.속성 유형을 이해하면 속성 설정이 더욱 정확합니다.
  • 자주 만나는retain,copy는 도대체 어떤 차이가 있습니까?
  • 실례 변수와 @property가 성명한 변수가 같습니까?

  • 설명

  • object-c 대상은 실례 변수와 방법으로 구성되어 있으며 @property 이후에 성명된 변수는 실례 변수와 일치할 필요가 없습니다. @property 이후에 성명된 변수는 컴파일링 기간에 자동으로 생성되기 때문입니다.따라서 클래스 내부에서만 이 변수를 사용하고 싶다면, 실례 변수만 설명하고 @property를 설명할 필요가 없습니다.@property가 성명한 변수는 @implement에서 @synthesize를 사용하여 합성 성명을 해야 합니다. @property의 성명 수량과 일치합니다.
  • object-c2.0 이후dot 조작부호iVar.property = value를 지원하여 조작을 간소화합니다. 컴파일러는 setter,getter 방법으로 속성을 자동으로 변환하고 생성된 getVariable나 setVariable를 사용하여 속성에 접근할 수 있습니다.
  • 변수 속성 (property attribute)
  • (쓰기 가능) - readwrite: 읽기 전용 액세스기를 생성합니다. 이 속성은 클래스 외부의 읽기와 쓰기를 허용합니다. -readonly: 읽기 접근기를 생성합니다. 이 속성은 클래스 외부에서만 읽을 수 있습니다.
    (setter 의미) - assign: 기본 형식, 간단한 값, 보통 원시 형식 int, 포인터에 사용됩니다.retain: 대상에 사용되며 원시 형식에 사용되지 않습니다.[newObject retain], [oldObject release]; – copy: 대상에 사용되며 원시 형식에 사용되지 않습니다.대상은 NSCopying 프로토콜을 실현해야 한다. 만약immutable 대상, 예를 들어 NSString*이라면 new Object retain], [old Object release]만 있으면 된다.immutable 대상이 아니면 alloc, init... 을 통해 새 대상을 만들거나, 부모 대상의copyWithZone: 을 호출해서 대상을 만듭니다.strong: 기본적으로 모든 바늘의 대상은strong 형식입니다.이 대상에 새 인용 값을 부여합니다. 이 인용 대상은retain이고, 이전 대상은release를 자동으로 시작합니다.cc 환경에서 모든 대상 변수는strong 형식입니다. 당신은 __strong Fraction *f1;로strong 변수를 설명할 수 있습니다.@property 기본값은strong 변수가 아니라 unsafe 입니다.retained 변수는 assign에 해당하며 현식 성명@property (strong, nonatomic) NSMutableArray *birdNames;이 필요합니다.weak:arc에만 사용되며 일반적으로 서로 인용하는 변수로strong 형식의 메모리 유출(서로 인용할 수 없음)을 방지합니다. 예를 들어 NSView*의subviews와 슈퍼뷰, 슈퍼뷰는 weak 변수입니다.주 변수 dealloc가 방출될 때,arc는 weak 변수가nil로 설정될 것을 보장합니다.이렇게 하면nil 호출에 충돌을 일으키지 않습니다.C++의 유사, weakptr의 사용 장면
    (원자성) - 원자성은 먼저 값을 메모리의 임시 주소에 쓴 다음에 원하는 위치에 쓴다는 것을 의미한다.atomic: 기본 접근기는 atomic입니다. 이것은 다중 루틴 환경에서의 병렬 접근 문제에 더욱 유리합니다.nonatomic: 비원자 접근.

    예.


    다음 예제에서는 Object-C Automatic Reference Counting을 NO로 설정합니다.
    //
    //  TestObject.h
    //  TestObject-C
    //
    //  Created by sai on 10/21/17.
    //  Copyright (c) 2017 sai. All rights reserved.
    //
    
    #import 
    
    
    // http://www.binpress.com/tutorial/learn-objectivec-objects-part-2-properties/59
    @interface TestObject : NSObject
    
    @property NSInteger id_; // default:readwrite,assign
    @property (readwrite,atomic) NSString* description_;
    @property (readwrite,atomic,assign) NSMutableArray* children_;
    
    @property (readonly) NSInteger status_;
    @property (readwrite,retain) NSMutableArray* books_;
    @property (readwrite,copy) NSString* bookmark_; // copy   NSCopying  ,  .
    
    @property (strong,nonatomic) NSString* artist_; //  ,  retain,   retain.
    
    //  ,   next_ dealloc  , next_ nil,   nil , .
    // weak   arc     GC  ,   arc .
    //@property (weak,nonatomic) TestObject* next_;
    
    +(void) testProperty;
    
    @end
    
    
    //
    //  TestObject.m
    //  TestObject-C
    //
    //  Created by sai on 10/21/17.
    //  Copyright (c) 2017 sai. All rights reserved.
    //
    
    #import "TestObject.h"
    #include 
    
    @implementation TestObject
    
    @synthesize id_;
    @synthesize description_;
    @synthesize children_;
    @synthesize status_;
    
    @synthesize bookmark_;
    @synthesize books_;
    //@synthesize next_;
    @synthesize artist_;
    
    -(void)dealloc
    {
        // object-c dealloc ,  .
        NSLog(@"toA.artist_ retainCount %ld",[self.artist_ retainCount]);
        [super dealloc];
    }
    
    +(void) testProperty
    {
        NSLog(@"========== testProperty ============");
    
        TestObject *toA = [TestObject new];
        TestObject *toB = [TestObject new];
    
        NSLog(@"========== test default value begin ============");
        // object-c nil, primitive  0
        assert(toA.id_ == 0);
        assert(toA.description_ == nil);
        assert(toA.children_ == nil);
        assert(toA.status_ == 0);
        assert(toA.bookmark_ == nil);
        assert(toA.books_ == nil);
    //    assert(toA.next_ == nil);
        assert(toA.artist_ == nil);
        NSLog(@"========== test default value end ============");
    
        NSLog(@"========== test setter begin ============");
    
        NSInteger retainCount1 = 0;
        NSInteger retainCount2 = 0;
    
        [toA setId_:1];
        toA.id_ = 2; // dot  ,  ,   setter  .
        NSString* description = [NSString stringWithFormat:@" I like %d",7];
        retainCount1 = [description retainCount];
        toA.description_ = description;
        retainCount2 = [toA.description_ retainCount];
    
        assert(toA.description_ == description);
        assert(retainCount1 == retainCount2 && retainCount1 == 1);
    
        NSMutableArray* children = [NSMutableArray new];
        retainCount1 = [children retainCount];
        toA.children_ = children;
        retainCount2 = [toA.children_ retainCount];
        assert(toA.children_ == children);
        assert(retainCount1 == retainCount2 && retainCount1 == 1);
    
    //     , readonly   setter  .
    //    toA.status_ = 1;
    
        retainCount1 = [description retainCount];
        toA.bookmark_ = description;
        retainCount2 = [toA.bookmark_ retainCount];
        NSInteger retainCount3 = [description retainCount];
        int64_t offset = (int64_t)toA.bookmark_;
        assert(offset == (int64_t)description); // NSString*   immutable  ,  retain .
        //   retainCount2 == 3,  2.
        // objc_setProperty_atomic_copy   retain .
        assert(retainCount1== 1 && retainCount2 >=2);
    
        NSMutableArray* books = [NSMutableArray new];
        retainCount1 = [books retainCount];
        toA.books_ = books;
        retainCount2 = [books retainCount];
        assert(retainCount2 == 2 && retainCount1 == 1);
    
        retainCount1 = [description retainCount];
        toA.artist_ = description;
        retainCount2 = [toA.artist_ retainCount];
        assert((retainCount2 - retainCount1) == 1);
    
        retainCount1 = [description retainCount];
        toA.artist_ = description;
        retainCount2 = [toA.artist_ retainCount];
        assert(retainCount2 == retainCount1);
    
        NSLog(@"========== test setter end ============");
    
        [toA release];
    }
    
    @end
    

    출력

    2017-10-24 17:58:03.308 TestObject-C[5307:303] ========== testProperty ============
    2017-10-24 17:58:03.309 TestObject-C[5307:303] ========== test default value begin ============
    2017-10-24 17:58:03.310 TestObject-C[5307:303] ========== test default value end ============
    2017-10-24 17:58:03.310 TestObject-C[5307:303] ========== test setter begin ============
    2017-10-24 17:58:06.822 TestObject-C[5307:303] ========== test setter end ============
    2017-10-24 17:58:06.823 TestObject-C[5307:303] toA.artist_ retainCount 5

    참고 자료


    Learn Objective-C, Objects (Part 2): Properties
    Programming in Objective-C Fourth Edition

    좋은 웹페이지 즐겨찾기