"지연"은 서로 다른 두 가지 상황에서 사용됩니다.
클래스 디자인을 비판 할 때, 클래스가 효과가 없다고 주장합니다. 클래스의 존재를 정당화하기에는 충분하지 않습니다. 사람들은 또한 이런 종류의 클래스를 "얇은"이라고 부릅니다. 이것은 아마 여기에있는 것이 아닙니다.
둘째, 게으른 평가 및 게으른 인스턴스이 클래스는 속성을 평가하거나 실제로 필요할 때 자체를 초기화하는 작업을 수행 것을 의미한다.
예를 들어 Employee 객체를 만드는 클래스가 있다고 가정합니다.
@implementation Employee
- (id) initWithID: (IdentificationCode*) ident
{
self =[super init]
if (self) {
_records=[self retrieveEmployeeRecordsFor: ident];
_identification=ident;
}
return self;
}
데이터베이스에서 모든 레코드를 검색하는 속도가 느릴 수 있습니다. 그리고 때때로 우리는 그 일을 할 필요가 없습니다. 예를 들면 :
- (BOOL) isFounder
{
if (indent.number<10) return YES;
return NO;
}
우리는 직원을 인스턴스화하는 경우 단순히 그들이 창립자 인 경우, 우리는 모두 자신의 기록을 찾아 볼 필요가 없습니다 찾으려면! 우리가 isFounder
를 호출하는 직원을 구성하는 경우
가
- (NSArray*) payments
{
return [self.records retrievePayStubs];
}
그래서, 우리는 데이터베이스 조회를 낭비 : 한편
.....
if ([thisEmployee isFounder]) {
[self sendCandyTo: thisEmployee.identification];
}
때때로 우리는 그들을 필요합니다. 하지만
payments
에 필요하기 때문에 건너 뛸 수 없습니다.
우리가하는 일은 생성자에서 데이터베이스 검색을 가져 와서 load
메서드에 넣는 것입니다.
- (void) load
{
if (records) return;
self.records=[self retrieveEmployeeRecordsFor: ident];
}
- (NSArray*) payments
{
[self load];
return [self.records retrievePayStubs];
}
이제 우리는 직원 기록을 실제로 필요할 때만로드합니다. 이미로드 된 경우 별도의 메소드 작업을 수행하지 않습니다. 지불 기록이 필요 없다면, 우리는 일을 전혀 할 필요가 없습니다.
클래스는 작업을 수행하는 데 마지막 순간까지 기다려야 만 작동합니다. 그것은 "게으르다!"
은 플러그인에서로드 된 클래스 일 수 있습니다. 어쩌면 플러그인/dyld/동적으로로드 된 코드에 대한 설명서를 확인하십시오 – nielsbot
클래스가 게으른 것이 아니라 목록이라는 것을 확신합니까? –
@JoshCaswell과 동의합니다. 나중에 런타임 소스에서 클래스에 지연로드에 대한 참조가 있음을 감안할 때. 클래스가 '게으른'것이 라기보다 거의 확실히리스트를 참조합니다. – lxt