2013-05-09 2 views
3

이 질문에 답을 얻었지만 그에 대한 많은 게시물을 읽었으며 대답이 명확하지 않은 것 같습니다.객관적인 C, 속성 vs ivars

내가 일반적으로 상당히 편리과 같이 my.m 파일의 구현 섹션에서 인스턴스 변수로 개인 변수를 선언 할 찾을 :

@implementation ViewController { 
    int someNum; 
    NSObject *myObj; 
} 

이 확인되고, 또는 현재 가장 좋은 방법은? 대신에 어떤 이유로 부동산을 신고해야합니까?

+0

.h 파일의 변수를 선언하고 @private로 지정하는 것은 기존의 코딩 방법입니다. 사실, 현재의 업계 표준 인 .m 구현에 해당 변수가 있습니다. – nik

답변

3

하나의 기술은 객체 유형 강한 참조를 얻을 것이다 ARC 가정하고 .m

@interface MyViewController() { 

NSInteger someNumber; 
NSObject *myObject; 

} 

@end 

@implementation MyViewController 

-(void)someMethod { 

someNumber++; 

} 

@end 

내에서 클래스 확장을 선언하는 것입니다. 그게 네가 한 짓이 아니야. 인터페이스와 구현을보다 명확하게 구분하고 패턴을 제공합니다. Private Implementation

속성을 사용하면 접근자를 조작 할 기회가 주어지며 KVC을 무료로 얻을 수 있습니다.

@interface MyViewController() { 

    NSInteger someNumber; 

} 

@property (copy,readwrite,nonatomic) NSObject *myObject; 

@end 

@implementation MyViewController 

-(void)someMethodWhichNeedsACopy:(NSObject *)aobj { 

self.myObject = aobj; //free copies , no smudging! 

} 

@end 

그리고 추가

-(void)setMyObject:(NSObject *)aobj 

-(NSObject *)myObject 

하거나 암시 적 개인 바르에게 접근 대체 할 수 있습니다

[_myObject doSomethingCool]; 

_myObject.thing = something; 

또는 KVC는 생성 된 접근에서 제공 한 사용하십시오

[myViewControllerInstance addObserver:someOtherObject forKeyPath:@"myObject" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL] 

을 입력 한 후 someOtherObject

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 

등의 메시지를 받게됩니다. 당신이하고있는 일은 잘못이 아니지만 더 많은 것을 할 수있는 다른 기술과 도구가 있습니다.

+0

정말 고마워. 고마워. – Mrwolfy

+0

기본적으로 명확한 유지 보수 가능한 코드를 제공하는 스타일을 사용하십시오. 당신이 법인 조직에서 훨씬 더 그렇다면. –