(18) [OC 고효율 시리즈] 가급적 불변 대상을 사용한다
(8) [OC 고효율 시리즈] 이해 대상 등 동성 중의 6조에서 보듯이 가변 내용을 콜렉션에 넣은 다음에 그 내용을 바꾸면 set의 내부 구조가 파괴될 수 있다.그래서 대상의 가변적인 내용을 최대한 줄인다.
2.readonly,readwrite
만약 하나의 속성이 대외적으로 읽을 수 있고, 대내적으로 읽을 수 있다면, 이 클래스의 공공 인터페이스에서readonly를 설명하고, 클래스 확장에서readwrite로 다시 설명해야 한다. 예를 들어 아래의 클래스와 같다.
@interface Person : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;
@property (nonatomic,strong) NSDate *birthday;
@property (nonatomic,readonly) NSArray *friends;
- (void)addFriend:(Person *)person;
- (void)removeFriend:(Person *)person;
@end
@interface Person ()
@property (nonatomic,readwrite,strong) NSMutableArray *friends;
@end
@implementation Person
- (instancetype)init
{
self = [super init];
if (self) {
_friends = [NSMutableArray array];
}
return self;
}
- (void)addFriend:(Person *)friend{
if(friend){
[_friends addObject:friend];
}
}
- (void)removeFriend:(Person *)friend{
if(friend){
[_friends removeObject:friend];
}
}
@end
이렇게 하면 사용자가 만약에 프렌드를 추가하거나 프렌드를 삭제하려면 반드시 개인 대상 자체를 통과해야 한다. 이렇게 하면 내부 데이터의 통일성을 유지하기 쉽다. 만약에 프렌드를 직접 노출시키면 프렌드의 수정 대상 자체가 모르기 때문에 버그가 발생하기 쉽다.
3. 가변적인 콜렉션 속성을 그대로 드러내지 마라
위의 코드는 어느 정도 문제가 있다. 비록 공공 성명에서 프렌즈는 NSArray이고 변할 수 없는 대상이지만 실제 되돌아오는 대상은 여전히 NSMutable Array이기 때문에 사용자는 강제 전환을 통해 수정할 수 있다.그래서 저희가 여자친구의 Getter 방법을 덮어쓸 수 있어요.
- (NSArray *)friends{
return [_friends copy];
}
copy에 관해서는 (6)[OC 고효율 시리즈]에서 속성에 대한 소개도 있습니다.
물론 너도 이 방법을 다시 쓰지 않을 수 있다. 왜냐하면 복제도 약간의 성능을 소모해야 하기 때문이다.
따라서 다른 사람의 클래스나 라이브러리를 사용할 때 클래스 자체가 제공한 속성에 대한 설정 방법을 최대한 사용하고 이런 방법을 빙빙 돌려서는 안 된다. 그렇지 않으면 데이터가 일치하지 않을 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.