2012-08-02 5 views
0

합성.몇 가지 코드를 그냥 작동하지 못한 이유를 난 그냥 알아 낸 것 재산권 Unretained

@interface Client : NSObject { 
    Connection *connection; 
} 

@property (retain) NSMutableDictionary *channels; 

이 구현 얹는 : 나는 다음과 같은 일을 가지고

@implementation Client 

@synthesize channels; 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // do whatever I want 
     NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    } 

    return self; 
} 

channels이 클래스의 init 생성자에서 0x0으로의 메모리 주소를 가지고 왜 어떤 생각? 왜 이런 일이 일어나고 있는지 나에게 알 수는 없다. 저는 확실히 그 생성자를 호출하고 있습니다. 그리고 속성을 종합해야만 제가 원하는 것을 무엇이든 할 수 있습니다.

명시 적 값으로 channels을 설정하지 않는 한
+2

당신이 초기화'channels'을 표시했습니다, 그래서 그것을 기대하는 코드 중에 가치가 없다 '0'이된다. 중요한 걸 버렸어? –

+0

http://stackoverflow.com/questions/3488446/is-a-synthesized-property-already-alloc-init-ed?rq=1 – hooleyhoop

+3

는'@의 synthesize'가 자동으로'당신을위한 객체를 alloc'하지 않습니다. 그냥 변수에 대한 getter와 setter를 만듭니다. – wquist

답변

4

, 그것은 nil 유지됩니다. 아마도 init 방법에서 다음을 수행하려고하셨습니까? 채널 설정

if (self) { 
    // do whatever I want 
    channels = [[NSMutableDictionary alloc] init]; 
} 

두 더 많은 방법 : 우리는 당신의 retain 접근을 사용하고 있기 때문에이 경우에, 우리가 사용하는

[self setChannels:[NSMutableDictionary dictionary]]; //These two lines... 
self.channels = [NSMutableDictionary dictionary]; //...are equivalent. 

주를 오토 릴리즈 +dictionary보다는 alloc/init, 경우 누출 것 ARC를 사용하지 않습니다. ARC를 사용하지 않는 경우 물론

, channels도 제대로 -dealloc에 발표해야합니다 당신은 결코 아무것도 채널을 설정하지 않기 때문에

- (void)dealloc 
{ 
    [channels release]; 
} 
+0

이것이 맞습니다. 나는 어리 석음에 당혹 스럽다. 그것은 코드의 쓰레기로드의 컷 다운 버전입니다. 내가 어떻게 그것을 놓쳤는지 나는 모른다. – Kezzer

+0

이런 일이 생깁니다. 이 질문은 속성이 자동으로 객체로 채워질 것이라고 생각하는 미래의 누군가에게 유용 할 것입니다. – andyvn22

+0

@ andyvn22, alloc/init은 dealloc에서 해제하는 것을 잊어 버린 경우 ARC를 사용하지 않을 때만 누출됩니다. 위의 모든 예제는 ARC를 사용하지 않을 때 (유지 된 속성의 경우에도) dealloc에서'[channels releases];를 가져야합니다. – AW101

1

그것은이 0x0입니다. 당신은 적어도 수행해야합니다

channels = [[NSMutableDictionary alloc] init]; 

를 다음의 dealloc에 ​​당신은에 기억해야합니다

[channels release]; 
+0

합성 된 setter 메서드를 사용하지 않는다면 내가 잘못하지 않는 한 alloc'd 변수에 수동으로'retain'을 호출해야합니다. –

+0

아니요, 'alloc'은 보유 수를 증가시켜'retain'이 필요하지 않습니다. 내가 또한 '보유'라고한다면 나는'release'를 두 번 호출해야합니다. new, alloc, retain 및 copy는 모두 보유 횟수를 증가시키기 때문에 해제해야합니다. – AW101

관련 문제