페이지

2010년 11월 14일 일요일

Declared Properties

header file에서 @property 선언은 getter/setter가 구현되있음을 알리는 것이고, implementation에서 @synthesize는 이것을 자동으로 구현해 주는 것이다. @synthesize를 사용하지 않으면 직접 구현해주면 된다.
@property class명 instance명;
여기서 @property와 class명 사이에 () 안에 ,로 구분지어진 속성을 넣을 수 있는데
Writability에 관한 : readwrite, readonly
Setter Semantics에 관한 : assign, retain, copy
Atomicity에 관한 : nonatomic, atomic
getter/setter naming에 관한 : getter=getterName, setter=setterName
이 있다.
Markup and Deprecation 또한 지원한다.
예를들자면

@property CGFloat x
AVAILABLE_MAC_OS_X_VERSION_10_1_AND_LATER_BUT_DEPRECATED_IN_MAC_OS_X_VERSION_10_4;

이런 식,
IBOutlet 또한 선언할 수 있다. (formal part는 아님)

위에서 @synthesize로 자동구현한다고 했는데 @dynamic도 사용할 수 있다.
property=ivar to indicate that a particular instance variable should be used for the property!
즉 ivar이라는 instance variable이 property로 사용된다는 얘기


@synthesize firstName, lastName, age = yearsOld;

예를들면 이렇다.
@dynamic의 경우는 getter/setter method가 동적으로 (파일 임포트라던가?) 로딩될 때 사용한다. 반드시 어디서 구현되있는지 프로그래머가 알고 사용해야 에러가 나지 않겠쬬
(Core Data 를 사용할때에는 NSManagedObject가 관리하기 때문에 property들의 getter/setter method를 구현할 필요는 없지만 propoerty를 사용한다면 @dynamic 으로 선언해줘야한다.)






Copy

If you use the copy declaration attribute, you specify that a value is copied during assignment. If you synthesize the corresponding accessor, the synthesized method uses the copy method. This is useful for attributes such as string objects where there is a possibility that the new value passed in a setter may be mutable (for example, an instance of NSMutableString) and you want to ensure that your object has its own private immutable copy. For example, if you declare a property as follows:
@property (nonatomic, copy) NSString *string;
then the synthesized setter method is similar to the following:
-(void)setString:(NSString *)newString {
if (string != newString) {
[string release];
string = [newString copy];
}
}
Although this works well for strings, it may present a problem if the attribute is a collection such as an array or a set. Typically you want such collections to be mutable, but the copy method returns an immutable version of the collection. In this situation, you have to provide your own implementation of the setter method, as illustrated in the following example.
@interface MyClass : NSObject {
NSMutableArray *myArray;
}
@property (nonatomic, copy) NSMutableArray *myArray;
@end
@implementation MyClass
@synthesize myArray;
- (void)setMyArray:(NSMutableArray *)newArray {
if (myArray != newArray) {
[myArray release];
myArray = [newArray mutableCopy];
}
}
@end

* 아래는 그냥 이점~
Declared properties address the problems with standard accessor methods by providing the following features:
  • The property declaration provides a clear, explicit specification of how the accessor methods behave.
  • The compiler can synthesize accessor methods for you, according to the specification you provide in the declaration. This means you have less code to write and maintain.
  • Properties are represented syntactically as identifiers and are scoped, so the compiler can detect use of undeclared properties.

댓글 없음:

댓글 쓰기