[Object-C]_[초급][object 클래스의 객체 및 속성 @property]
13363 단어 언어 특성
장면
설명
iVar.property = value
를 지원하여 조작을 간소화합니다. 컴파일러는 setter,getter 방법으로 속성을 자동으로 변환하고 생성된 getVariable나 setVariable를 사용하여 속성에 접근할 수 있습니다.(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