2012-03-12 5 views
-1

현재 응용 프로그램에서 올바른 메모리 관리를 따르고 있는지 확인하려고합니다. 그래도 두 가지 질문이 있습니다.iPhone 속성 문제

(1) dealloc()에서 [self.myString release]를 릴리스해야합니까? 이것이 언제 공개되지 않을까요?

(2) viewDidUnload()에 _myString = nil을 설정해야합니까? 객체가 오토 릴리즈되지 않는

@interface ViewController : UIViewController 
{ 
    NSString *_myString; 
} 

@property (nonatomic, retain) NSString *myString; 

@end 


@implementation ViewController 

@synthesize myString = _myString; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.myString = [[NSString alloc] initWithString:@"Hello World"]; 

    NSLog(@"%@", self.myString); 
} 

- (void)viewDidUnload 
{ 
    self.myString = nil; 
    [super viewDidUnload]; 
} 

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

@end 
+0

이 기능을 사용하도록 설정하면 ARC (Automatic Reference Counting)로 전환하는 것이 좋습니다. 컴파일러가 모든 것을 릴리스하므로 직접 아무 것도 릴리스 할 필요가 없습니다. –

+0

이것은 옵션이 아니지만 제안에 감사드립니다. – Vikings

+0

좋아, 행운을 빈다! –

답변

1

코드가 정상적으로 처리됩니다. 다른 것을 할 필요가 없습니다.

(1) dealloc()에서 [self.myString release]를 릴리스해야합니까? 이것이 언제 공개되지 않을까요?

self.myString_myString과 동일한 개체를 반환합니다. 이미 [_myString release]을 한 번 수행 했으므로 다시 해제하면 안됩니다.

(2) viewDidUnload()에서 _myString = nil을 설정해야합니까?

같은 상황. self.myString = nil은 이미 _myString을 출시하고이를 nil로 설정합니다. 다시 할 필요가 없습니다.

두 개의 개별 개체 인 _myStringself.myString이 있다고 생각하는 것 같습니다. 그건 사실이 아니야. @synthesize myString = _myString가하는 모든 것은이 효율적으로 동일한 두 접근 방법 만들고입니다

- (NSString*)myString { return _myString; } 

- (void)setMyString:(NSString*)newValue 
{ 
    if (newValue != _myString) { 
     [_myString release]; 
     _myString = [newValue retain]; 
    } 
} 

는 또한 x = self.myStringx = [self myString] 동일하다, 그리고 self.myString = x[self setMyString:x]는 동일하다.

+0

dealloc 메서드에서 다른 [self.myString release] 또는 [_myString release]보다 하나를 릴리스하는 것이 더 좋습니까? 아니면 두 가지 모두 동일하지 않으므로 문제가되지는 않습니까? – Vikings

+0

'[_myString release]'하는 것이 더 좋습니다. 당신의 객체의 하위 클래스에서 누군가가 다른 행동으로'-myString' 또는'-setMyString :'의 override를 구현했을 가능성이 있습니다. '[self.myString release]'또는'self.myString = nil'을하는 것은 서브 클래스의'-dealloc'이 일어난 후에 그 재정의를 호출 할 것입니다. 이것은 예상치 못한 일입니다. 그럴 가능성은 없지만 왜 위험합니까? –

+0

고마워, 나를 위해 그것을 정리. – Vikings

0

모든 alloc를 들어, release이 있어야합니다. initWithString에 대한 문서를 보면 autoreleased처럼 보이지 않으므로 괜찮습니다.

self.myString = nil;은 안전합니다. 예. 이렇게하면 실수로 myString에 값을 할당하지 않고