2011-01-26 3 views
1

이것은 아마도 지금까지 알아야 할 것이므로 NSTimer 클래스 메소드를 사용하여 NSTimer의 인스턴스를 생성하고 있습니다. 나는 꽤 반환 된 객체가 autoreleased라고 확신한다. 내 질문은 타이머 객체 (메소드 : 1)를 유지하고 해제해야하거나 간단히 @property에 직접 할당해야한다. (방법 : 2) (전혀 다른 일을해야합니까?)클래스 메서드로 생성 된 개체를 유지 하시겠습니까?

// METHOD: 1 
@property (nonatomic, retain) NSTimer *myTimer; 

.

NSTimer *tempTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(executeOnTimer) userInfo:nil repeats:YES]; 
    [self setMyTimer:tempTimer]; 
    //[tempTimer release]; 

.

- (void)dealloc { 
    [pulseTimer release]; 
    [super dealloc]; 
} 

하거나 :

// METHOD: 2 
myTimer = [NSTimer scheduledTimerWithTimeInterval:10.0 target:self selector:@selector(executeOnTimer) userInfo:nil repeats:YES]; 

편집 : 난 그냥 쓰는 경우

마지막 요점, 속성에 할당하지 않고 (아래 참조)는 타이머가가는 것을 어떤 기회가있다 할당이 해제되면 기본적으로 프로그램이 끝날 때까지 머물러있게됩니다. 그 궁금증이 어떻게 유지 될까?

self.myTimer = tempTimer; 
// don't call [tempTimer release] 

이 때문에 그것을 유지 재산에 automcailcally을 유지합니다 :

[NSTimer scheduledTimerWithTimeInterval:120.0 target:self selector:@selector(executeOnTimer) userInfo:nil repeats:YES]; 
+0

'NSTimer'는 특별한 배려가 있습니다. 'scheduledTimerWithTimeInterval ...'메시지는 타이머를 초기화 할뿐만 아니라 runloop에도 추가합니다. 이렇게하면'NSTimer'가 해제되는 것과 run-loop 내부에서 소유권을 되찾기 위해'invalidate' 메소드를 호출해야합니다. [- (void) invalidate]에 대한 추가 정보 (http://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Classes/NSTimer_Class/Reference/NSTimer.html#//apple_ref/occ/instm/ NSTimer/무효화). –

답변

2

:

self.myTimer = [NSTimer scheduledTimerWithTimeInterval: ...]; // implicit setter 

또는

[self setMyTimer: [NSTimer scheduledTimerWithTimeInterval:...]]; // explicit setter 

또는

myTimer = [[NSTimer scheduledTimerWithTimeInterval: ...] retain]; 

또는

self->myTimer = [[NSTimer scheduledTimerWithTimeInterval: ...] retain]; 
+0

두 번째 예제에서 myTimer를 두 번 유지하므로 한 번 릴리스해야합니다. –

+0

@Time Machine : 첫 번째 예제에서 나는 [self setMyTimer : [NSTimer ...]]와 똑같은 글을 썼다. 그래서 단 한 번.아직 NSTimer –

+0

에 대한 참조가 필요한 경우 '출시'하지 않습니다. 두 번째 예를 말씀 드렸습니다. –

1

이것은 좋은 방법이다.

이있는 동안 myTimer = …을 호출하면 설정자가 사용되지 않습니다. 같은 효과 다음 중 하나를 수행 할 수있는 NSTimer를 통해 소유권을하기 위해

+0

에픽 철자가 실패합니다. 어리석은 작은 iPod 키보드. –

+0

릴리스 메시지가없는 METHOD 1과 같습니다. –

+0

실수로 타이머를 소유하고 있지 않기 때문에 릴리스가 필요하지 않습니다 (즉, 할당이 없음). 내 속성은 [self setMyTimer : tempTimer]; 또는 self.myTimer = tempTimer; 유지는 dealloc의 릴리스와 균형을 이룹니다. – fuzzygoat

관련 문제