2010-06-21 6 views
2

나는 어리 석다.객관적인 C의 차이점은 self.variable과 variable assignment이다.

저는 약 3 시간 동안 메모리 누수를 추적 해 보았습니다.이 메모리 누수는 내 정신을 파괴하고 내 앱 절반을 주석 처리 한 후 다음 결론에 도달했습니다.

올바른 장소에서 다음을 제공하십시오. 나는 특히 objectice C를 경험하고 있지 않다

NSString *blah; 

@property (nonatomic, retain) NSString *blah; 

@synthesize blah; 

-(id)initWithBlah:(NSString*)b { 

    self.blah = b; //this leaks 
    blah = b;   //this does not 

} 

, 나는 클래스의 외부 내가 = B object.blah 호출 된 경우 이해; b를 유지하는 setter 함수를 투명하게 호출합니다. 함수 안에서 나는 self.blah = b로 설정함으로써 추정하고있다. 나는 어떤 이유로 든 두 배로 유지하고 있는가?

누군가가 내게 왜 그런지 설명 할 수 있을까요, 아니면 내가 잘못하고있는 것이 아닌지 설명해 줄 수 있습니까?

건배

답변

2
blah = b 

직접 클래스 인스턴스 변수를 수정합니다.

self.blah = b 

은 존재하는 경우 접근자를 호출하므로 필요에 따라 리소스가 유지됩니다.

클래스가 해제 될 때 리소스를 해제하려면 dealloc 메서드에 [blah release];을 추가해야합니다.

2

실수입니다. 코드가 initWithBlah:에서 반환 된 후에 더 이상 문자열이 주변에 의존 할 수 없기 때문에 blah = b; 할당은 거의 의미가 없습니다. 다음에 액세스 할 때마다 이미 할당이 해제되었을 가능성이 큽니다.

self.blah = b; 지정자를 호출하고 문자열의 소유권을 가져 오기 때문에 할당이 정확합니다. 물론 메모리 누출을 막기 위해 -deallocblah을 릴리스해야합니다.

+0

아 당신을 감사합니다. 나는 어떤 이유로 인해 setter가 투명하게 코드의 일부분이 그 존재를 기억하고 파괴시에 그것을 공개적으로 해제한다는 사실을 기억하기 때문에 그것을 가정했다. 고마워, 내 문제가 해결된다. – dageshi

+2

그건 그렇고, 관례는'NSString *'변수에'(nonatomic, retain) 대신'@property (nonatomic, copy)'를 사용하는 것입니다. retain을 사용하면 다른 객체가 속성에 변경할 수있는 문자열을 할당 한 다음 나중에 클래스에 알리지 않고 문자열의 내용을 수정할 수 있으므로 캡슐화가 중단됩니다. –

0

접근자를 사용하는 것이 좋습니다. 누설되면 다른 것이 잘못되었습니다.

특히 이니셜 라이저를 올바르게 호출해야합니다. 즉, 매개 변수가 수신자에 의해 암시 적으로 소유되어 있지 않은 코코아 메모리 관리 지침을 따라야합니다.

그래서 그것의 오토 릴리즈 문자열을 통과 할 때 잘 될 것입니다 다음

YourObj *obj = [[YourObj alloc] initWithBlah:[[NSString alloc] initWithString:@"blah"]]; 

당신이해야 또 다른 한가지 :

YourObj *obj = [[YourObj alloc] initWithBlah:[NSString stringWithString:@"blah"]]; 

을 인해 유지 문자열 전달에 다음 누출 동안 인식 된 속성이 자동으로 정리를 처리하지 않으므로 처리해야합니다. -dealloc :

- (void)dealloc { 
    self.blah = nil; 
    // ... 
} 
1

단지 blah 만 지정하면 문자열에 할당되지 않습니다. self.blah를 주면 self를 시작하고 자체 클래스를 할당하고 액세스하려는 변수를 할당하려고 시도합니다. 그래서 dealloc 메서드에서 해제하거나 blah = nil로 설정해야합니다.

- (void)dealloc 

{ 

    self.blah = nil; 

     or 

    [self.blah release]; 

} 
관련 문제