3

특정 질문이 있는데 답변을 찾을 수 없습니다.Objective-C의 @property 및 weak 속성 사용

몇 가지 의견이있는 스토리 보드가 있습니다. 일부보기에는 아울렛이 있습니다. 약점 매개 변수로 내 콘센트를 선언해야한다는 것을 알고 있지만 getter 및 setter를 선언해야하는지 (@property 및 synthesize로) 알지는 못합니다.

1 - __weak IBOutlet UITableView *table; 
2 - @property(nonatomic, weak) UITableView *table; 

방금 ​​(1)을 선언하면 뷰 컨트롤러에서 "테이블"을 수행 할 수 있습니다.

(1)과 (2)를 선언하면 self.table을 할 수 있습니다.

다른 점은 무엇입니까? 가장 좋은 방법은 무엇입니까?

답변

4

(1) 인스턴스 변수 선언입니다 다른 속성으로한다. (2)는 속성 정의입니다. 속성을 합성하거나 자동 합성을 사용하면이 경우 인스턴스 변수도 생성됩니다. 대개 공개 API 또는 다형성에 대한 뷰를 노출하지 않으려면 인스턴스 변수를 선언하는 것만으로 충분합니다.

속성이 선호 될 수있는 몇 가지 다른 특별한 경우가 있습니다. 예를 들어, 블록 내에서 뷰를 참조하고 싶지만 self을 보유하지 않으려면 weakSelf 패러다임을 사용하면 더 쉽게 속성에 액세스 할 수 있습니다. 그러나 뷰에 대한 약한 참조도 만들 수 있으므로 이는 의의가 있습니다.

표기법 (.) 표기법을 사용하지만 직접 또는 사용 빈도가 적은 화살표 (->) 표기법을 사용하여 인스턴스 변수에 액세스하는 것은 수행되지 않습니다.

그래서 다음 중 하나를

[_tableView reloadData]; 

또는

[self->_tableView reloadData]; 

기억이 나쁜 액세스의 무기 호 참조 결과에 ->를 사용하여.

+0

답변 해 주셔서 감사합니다. 당신은 weakPelf 패러다임이 사용되는 예제를 가르쳐 주시겠습니까? – Tony

+2

@Tony http://stackoverflow.com/questions/12901536/reference-to-self-inside-block –

0

둘 다 "테이블"로 만들 수 있습니다. 구현시 @synthesize을 사용하여 속성을 합성하면됩니다.

+0

이전 답변에서 덧글을 달았습니다. – Tony

-1

일반적으로 콘센트를 소유권을 암시하는 강력한 속성으로 선언 할 이유가 없습니다. 대부분의 조회수는 superviews 소유입니다. 그런 다음 치료

@property (weak) IBOutlet UITableView *table; 

@synthesize table = _table; 
- (void)someMethod 
{ 
    [self.table doSomething ....] 
} 

도 참조 Managing the Lifetimes of Objects from Nib Files

+0

내 질문은 내가 약한 것으로 선언해야하는 이유가 아닙니다. 나는 정말로 속성을 선언하고 합성하는 이유를 알고 싶다. 왜 __weak IBOutlet UITableView * table;을 선언하지 않는가? ? – Tony

+0

나는 글래스 유리를 들여다 보았고 지금은 질문이나 대답을 이해하지 못합니다. 용서를 구하십시오. –

0

첫 번째 변수는 인스턴스 변수이고 두 번째 변수는 속성을 정의합니다. 컨벤션은 항상 컨셉으로 명명 된 iVar을 사용하여 자동 합성을 기본값으로하는 속성을 사용합니다. _varName. 그런 다음 _varName 또는 self.varName을 사용하여 변수에 액세스 할 수 있습니다. 속성을 통해 변수에 항상 액세스하는 것이 좋지만 속성의 getter를 재정의하는 경우 만 예외입니다.