2012-03-19 1 views
0

Objective C '의 인스턴스 변수는 항상 0 (또는 정확한 데이터 형식에 따라 nil, NULL 또는 false)로 초기화된다는 것을 알고 있습니다.' 아래 부에서 TEST2 stackoverflow questioninit이 인스턴스 변수를 nil로 설정하지 않은 이유는 무엇입니까?

이유 nil 설정되지 Fruit의 오렌지 인스턴스의 인스턴스 변수 _willBeRipeBy인가? STAssertNil([orange willBeRipeBy],nil)에서 실패합니다.

test2 뚫고 난 explicitatly 전무로 _willBeRipeBy를 설정하는 방법 init를 생성하거나 I가 test1 바꾸면 실행 순서를 변경하는 경우 TEST3. test1에서 appleorange 사용하는 메모리를 초래하는 것 같지만 과일을 init 이유 인스턴스 변수 전무로 재설정하지 생성

.

나는 객관적인 C, 고맙습니다. 구현의 블록 내에서 선언 변수 인스턴스 변수 아니므

@interface Fruit : NSObject 
- (NSDate *)getWillBeRipeBy; 
- (void)setWillBeRipeBy:(NSDate *)ripeBy; 
@end 

@implementation Fruit 

NSDate *_willBeRipeBy; 

- (NSDate *)getWillBeRipeBy{ 
    return _willBeRipeBy; 
} 
- (void)setWillBeRipeBy:(NSDate *)ripeBy{ 
    _willBeRipeBy = ripeBy; 
} 
@end 

@implementation TestIvarInitialisationTests 

- (void)test1 
{ 
    Fruit *apple = [[Fruit alloc] init]; 
    STAssertNil([apple getWillBeRipeBy],nil); 
    NSDate * now = [NSDate date]; 
    [apple setWillBeRipeBy:now]; 
    STAssertEqualObjects([apple getWillBeRipeBy], now,nil); 
} 

- (void)test2 
{ 
    Fruit *orange = [[Fruit alloc] init]; 
    STAssertNil([orange getWillBeRipeBy],nil); 
} 
@end 
+1

메소드 앞에'get', btw를 붙이지 마십시오. 'willBeRipeBy' 또는'ripeDate' 또는'willBeRipeDate'라고 부르면됩니다. – bbum

답변

4

당신은 @implementation 지시 후 헤더 파일 내부 인스턴스 변수 또는 {} -brackets에서 변수를 선언해야합니다.

귀하의 구현은 글로벌 변수

btw입니다. "get ..."과 같은 메소드의 이름을 지정하면 안됩니다. 이것은 코코아 이름 지정 규칙을 위반하는 것입니다. 알 수없는 크기를 가진 비 객체 유형을 설정할 때만 "get .."을 사용해야합니다. 예 : CGRect rect; [userInfoDictionary getValue:&rect forKey:@"bla"]
getter 및 setter 메소드와 함께 인스턴스 변수를 자동으로 구현하는 속성 (및 @synthesize property)을 사용할 수 있습니다.

+0

저를 던지고 고마워요. – ken

2

을 (엑스 코드 4.3을 사용하여, 자동 참조 iOS5.0이 믿고)들은 클래스 인스턴스간에 공유 전역이다. 그리고 분명히 전역 변수는 정상적인 값으로 초기화되지 않을 수도 있습니다.

귀하의 과일 클래스는 다음과 같아야합니다

@interface Fruit : NSObject 
@property(strong) NSDate *willBeRipeBy; 
@end 

@implementation Fruit 
@synthesize willBeRipeBy; 
@end