2013-05-07 2 views
2

나는 아직도 코코아 터치의 뉘앙스를 배우고있다. ARC 환경에서 float, int 등의 유형에 대해 내부적으로 생성되는 getter/setter의 종류는 무엇입니까?ARC 환경에서의 세터와 게터

- (NSURL *)url { 
    if (_url == nil) 
    _url = [[MyURL alloc] initWithURL:url]; 
    return _url 
} 

- (void)setUrl:(NSURL *)theUrl { 
    if (theUrl != _url) { 
     [_url release]; 
     _url = [theUrl retain]; 
    } 
} 

하지만, ARC 환경 방출에와 사용할 수 없습니다 유지 :

나는 재산이 아닌 ARC의 개체입니다 만약 내가 이런 일이있을 수 있음을 알고있다. 어떤 종류의 getter/setter가이 경우 ARC 환경을 위해 자동으로 생성됩니다.

그리고 float, int 등 스칼라 유형은 어떻습니까?

답변

3

생각을 몇 :

  1. 액세서 방법 (등 int, bool) 기본 데이터 유형에 대한 (게터와 세터), 매우 개체에 대한 표준 접근 방법처럼 전용 차이점은 객체의 컨텍스트 내에서를 제외하고는 아무런 의미가 없으므로 메모리 관리 의미가 없다는 것입니다. 따라서 이러한 기본 데이터 유형을 사용하는 strong 또는 weak이 표시되지 않습니다. 따라서 retain의 개념은 적용 할 수 없습니다. ARC의 strong 재산권 비 ARC 코드의 대상물의 retain 속성 세터 다르지 아니므로 뒷이야기

  2. , 시스템은 선언 된 개체 세터 생성. 보유 수를 늘립니다 ("강력한 참조를 유지합니다"). 자, 여러분이 strong 속성에 대한 ARC 설정기를 직접 작성했다면 (정말로해서는 안됨), retain이라는 코드 행을 작성하지는 않지만 컴파일러는 장면.

  3. 게터 방법을 잘 모르겠다. 이해가되지 않는다. 일반적으로 getter는 alloc 또는 init을 수행하지 않습니다.

  4. 귀하의 세터는 좀 더 가까이 (그리고 나는이 retain로 선언 된 @property 위해이었다 가정). 분명히, 자동으로 합성 된 호텔은 자동으로 메모리 수명 한정자를 선택 (예를 들어, retainassigncopy 대 ...) 당신을 위해 적절한 코드를 생성, 그래서 그냥 자신의 일을하는 것이 좋은 것입니다.

  5. 그런데 실제 시스템 생성기에는 KVO (key-value-notification) 호출도 포함됩니다. KVO가 무엇인지 걱정할 필요는 없지만 핵심은 손으로 쓴 작성기 메서드로 코드를 산재시키지 않으려는 것입니다. 왜냐하면 KVO 사용을 시작할 때 그렇게했기 때문에 후회할 것입니다. 이것은 컴파일러가 자신의 접근 자 메소드를 합성하도록하는 또 다른 이유 일뿐입니다.

+0

3. 나에게 의미가, 그냥 게으르게 - 초기화 게터 –

+0

덕분 !!!!!!!!!!!!! – SpaceDog

+0

@Catfish_Man 아마도 "이해가되지 않는다"는 것이 너무 강했다. 하지만 'url'이라는 getter를 사용하면 ivar을'url '변수로 설정합니다 (ivar? global?)라는 'url'은 DD에 대한 공격을하지 않고서 나에게 아주 좋은 구현처럼 보이지 않습니다. (사실, 이름 짓기 문제뿐만 아니라 많은 이유로). 계산적으로 비싸거나 메모리 집약적 인 리소스라면 lazy 초기화를 사용 하겠지만 여기서는 신중한 것으로 보이지 않는다. 만약 내가 그렇게했다면 약간 다른 구현을 할 것이다. – Rob

4

ARC가 모든 해제 및 보관을 처리합니다. 아마 합성 된 getter와 setter를 사용해야 할 것이다.하지만 그렇게하지 않는다면, 단지 ivar을 설정하고 다른 모든 코드를 제거하면된다.