2012-09-30 7 views
0

참고 : 나는 다음과 같은 특성을 가진 UILabel의이 ARC목표 - C 사용자 정의 세터

를 사용하고 있지 않다 : @property (nonatomic, retain) UILabel *someLabel; 나는 사용자 정의 세터를 설정하려합니다. @property이 실제로 retain을 호출하기 때문에 다음 코드가 누수가 발생합니까?

- (void)setSomeLabel:(UILabel *)someLabel 
{ 
    if (someLabel != self.someLabel) { 
     [self.someLabel release]; 
     self.someLabel = [someLabel retain]; 
    } 

    // some custom code here 
} 

답변

8

참고 : 나는 당신은 정말, 정말해야

ARC

를 사용하고 있지 않다.


세터는 무한 루프입니다. self.someLabel = ...에 대한 호출은 루프를 발생시키는 [self setSomeLabel:...]과 정확히 동일합니다.

원래 올바른 매뉴얼 세터는 다음과 같습니다 : 다른 일반적인 패턴이있다

- (void)setSomeLabel:(UILabel *)someLabel 
{ 
    [someLabel retain]; 
    [_someLabel release]; 
    _someLabel = someLabel; 

    // some custom code here 
} 

. 주요 질문은 개체가 동일한 값으로 다시 설정된 경우 "일부 사용자 지정 코드"가 실행되어야하는지 여부입니다. 그렇지 않다면이 패턴이 더 의미가 있습니다 :

- (void)setSomeLabel:(UILabel *)someLabel 
{ 
    if (someLabel != _someLabel) { 
    [_someLabel release]; 
    _someLabel = [someLabel retain]; 

    // some custom code here 
    } 
} 
+0

+1 가장 아름다운 설명. 첫 번째 코드 샘플에서 – Till

+0

은'_someLabel = label;'_someLabel = someLabel;이 아니어야합니까? – AlexChaffee

+0

ARC에서 여전히 보유/해제 셔플이 필요합니까? 그리고 합성 된 setter가 우리가 흉내 내야 할 '강'과 '비 원자'와 같은 여러 가지 수정 자 모두와 마찬가지로) 다른 마술이 있습니까? – AlexChaffee

0

아니요, 여기서는 맞춤 설정기를 사용하는 것처럼 완벽하게 문제가 없습니다.

@Property는 접근 자 메서드를 선언하는 것과 같습니다.

@Synthesize는 setter 및/또는 getter가 구현되지 않은 경우에만 속성 선언 속성을 기반으로 접근기 메서드를 생성합니다.

+2

당신이 말한 것의 모든 점은 꽤 잘못되었습니다. – InsertWittyName

+1

@InsertWittyName, 당신은 무엇을 의미합니까? Shashikanth가 OP의 코드에서 무한 루프를 포착하지는 않았지만 재산 및 합성에 대한 그의 진술은 정확합니다. 속성 선언과 접근자를 직접 선언하는 것은 아주 미묘한 차이가 있지만 매우 중요하지는 않습니다. –

+0

@RobNapier 죄송합니다. 제 의견에 조금 짧았으나해서는 안되었습니다. 나는 재산 및 합성에 대한 설명이 조금 더 명확 할 수 있다고 생각한다. (그들은 정확하게 기술되어있다.) – InsertWittyName

0
난 당신이 ARC를 사용하지 않는 있으리라 믿고있어

...

당신은 과도하게 유지 또한 재산에 릴리스를 호출에 전달되는 someLabel 것은 잘되지 않습니다 걸 정확!

내가 대신 속성의 인스턴스 변수를 사용합니다 :

- (void)setSomeLabel:(UILabel *)someLabel 
{ 
    if (someLabel != _someLabel) { 
     [_someLabel release]; 
     _someLabel = [someLabel retain]; 
    } 

    // some custom code here 
} 
+0

그곳에는 너무 많은 것이 없으며 무한 재귀가 있습니다. (무한 재귀가 무한히 유지 될 것이라는 우월한 점을 제쳐두고 재귀를 고치는 것은 유수를 고친다.) –

6

그 코드는 방법 setSomeLabel:를 호출 self.someLabel 원인을 사용하는 등 무한 루프에 응용 프로그램을 이끌 것입니다.

당신은 사용자 정의 세터 아래의 코드를 시도 할 수 :

@synthesize someLabel = _someLabel; 
- (void)setSomeLabel:(UILabel *)someLabel 
{ 
     if (someLabel != _someLabel) 
     { 
      [_someLabel release]; 
      _someLabel = [someLabel retain]; 
     } 

     // custom code 
} 

- (void)dealloc 
{ 
    [_someLabel release]; 
    // ... other releases 
    [super dealloc]; 
} 
+0

무한 루프의 좋은 점! – InsertWittyName