2012-03-31 3 views
0

최근에 ViewController에서 ivars 및 등록 정보를 더 이상 선언 할 필요가없는 게시물을 읽었습니다. 코드에서 중복 선언을 제거했습니다.ivars가 예상대로 작동하지 않습니다.

내가 눈치 챘을

정말 수수께끼 효과는 속성이 선언 바르 부족한 경우, 그것은 self. 예 선행 될 필요가 있다는 것입니다 :

CustomVC.h :

@interface CustomVC : UIViewController <UITableViewDelegate,UITableViewDataSource> { 
... 
@property (nonatomic, strong) IBOutlet UITableView *itemsTableView; 

CustomVC .m :

[itemsTableView reloadData]; // cellForRowAtIndexPath not called 
[self.itemsTableView reloadData]; // table view refreshed as expected 

액세스하는 데 문제가있는 경우 변수가 self.이 아니라면, 컴파일 시간이나 런타임 오류를 기대할 수 있습니다. 그러나 자동으로 오류가 발생하여 디버깅하기가 어려울 수 있습니다.

답변

1

ivar (직접 액세스)를 호출하고 self.myIvar (접근 자 메서드 - 속성 -)를 사용하는 것은 동일하지 않습니다.

직접 ivar 액세스를 사용하는 경우 관찰자에게 알리지 않으므로 일부 이벤트가 트리거되지 않습니다. self.myIvar를 사용하는 것이 가장 좋습니다 (일부는 동의하지 않습니다).

매우 상세한 매우 흥미로운 answer in the link을 읽으십시오.

또 다른 좋은 점은 다음과 같은 특성을 합성하는 것입니다 (". 자기"를 잊고)

@synthesize myIvar = myIvar_; 

이 실수로 바르에 직접 액세스를 방지 할 수있는 방법을 보장

+0

난 행동 seeing은'self.'를 생략 할 때와 거의 같으며, 속성 simple은 업데이트되지 않습니다. – Echilon

+0

예, ** '자기'를 생략 할 경우 당신이 직접 "ivar **"을 사용하고 속성을 사용하지 않기 때문에 ("관찰자는 알리지 않습니다"), "자기"를 사용할 때. 당신은 재산에 접근하여 관찰자들에게 당신의 가치가 변했다는 것을 알려주고 있습니다. – moxy

+0

나는 절반을 이해합니다. 이상한 점은'self.'없이 접근하는 배열 속성을 가지고 있다면 그 객체에 객체를 추가 할 수 있다는 것입니다. 그리고 이후에 count를 할 때 여전히 비어 있습니다. – Echilon

관련 문제