2011-11-21 2 views
0

간단한 init 기능을 사용하는 방법을 이해하려고 시도하고 어디에서 실수를했는지 알지 못합니다. 누군가 도울 수 있습니까? Rectangle.hobj-c의 초기화 프로그램을 이해하려고 시도 할 수 없습니다.

@interface Rectangle : NSObject 
{ 
    int width; 
    int height; 
} 
-(id)initObject; 
@end 

Rectangle.m

@implementation Rectangle 

-(id)initObject{ 
    if (self = [super init]) { 
     height = 5; 
     width = 7; 
    } 
    return self; 
}  

@end 

그리고 ViewController.h에 내가 Rectangle.h을 가져

는 * RECT 객체를 선언하는 .m에 내가 실행 (? 실행?)의 initObject을.

ViewController.h

#import <UIKit/UIKit.h> 
#import "Rectangle.h" 
@interface ViewController : UIViewController 
{ 
    Rectangle *rect; 
} 
@end 

ViewController.m

-(void)viewDidLoad 
{ 
    rect = [[Rectangle alloc] initObject]; 
    NSLog(@"%@", rect); 

    [super viewDidLoad]; 

} 

나를 반환의 initObject :

2011-11-21 09:43:02.625 initializers[43693:f803] <Rectangle: 0x6ab1660> 
+0

왜이 "만약 (자기 = [슈퍼 초기화]) {?" – doNotCheckMyBlog

+1

문제가 없으니 괜찮습니다. 'height'와'width'를보고 싶다면'NSLog (@ "% d, % d", rect.height, rect.width)를 써라. " – beryllium

+0

나는 많은 샘플을 보았다. 나는 또한 보았다 : self = [super init]; if (self) {... –

답변

3

내가 볼 수있는 코드의 유일한 문제는 정당한 이유가 없으므로 이니셜 라이저 -initObject입니다. 매개 변수를 전혀 사용하지 않기 때문에 시스템의 다른 모든 매개 변수없는 초기화 도구와 마찬가지로 -init이라고해야합니다.

로그 출력에 관해서는 당신의 혼동이 <Rectangle: 0x6ab1660>이라고 말하는 사실에 있다고 생각합니다. 이것은 정상입니다. -description (이 출력을 반환하는 메서드)의 기본 구현은 개체 클래스의 이름 뒤에 개체 주소가옵니다. 즉, -[NSObject description]은 다음과 같은 것을 구현 될 가능성이 높습니다 :

- (NSString *)description { 
    return [NSString stringWithFormat:@"<%@: %p>", 
             NSStringFromClass([self class]), 
             self]; 
} 

이것은 개체의 인스턴스 변수가 인쇄하지 않을 것을 의미합니다. 여러 내장 클래스는 기록 될 때 인스턴스 변수를 인쇄하지만 이는 해당 클래스에 맞게 구현되었으며 일반적인 메커니즘이 아닙니다. 당신이 당신의 Rectangle 개체가 올바른지 확인하려는 경우, 당신은과 같이 -description을 구현할 수 :

- (NSString *)description { 
    return [NSString stringWithFormat:@"<%@: %p width=%d, height=%d>", 
             NSStringFromClass([self class]), 
             self, 
             width, 
             height]; 
} 
+0

다른 답변은 중복되어 있습니다! 나는 지금 일하러 돌아갈거야 ... :) – jrturton

+0

도움을 주셔서 감사합니다.) 그래서, init 함수를 사용할 때 -description을 사용해야합니다. –

+0

@TomaszSzulc'stringWithFormat'에 대한 인수로 전달 될 때 커스텀 클래스가 기본적으로 다르게 인쇄되기를 원한다면 반드시'description'을 오버라이드하면됩니다. 다른 사람들이 언급했듯이'description '밖에서 변수를 테스트 할 수 있습니다. TLDR : __have__는'init' 함수로'description'을 사용하지 않습니다. –

0

오류가 없습니다! Rectangle 클래스에는 메서드가 없으므로 NSLog(@"%@", rect);을 호출하면 개체의 클래스가 반환되고 메모리의 해당 주소가 반환됩니다.

당신은 width과 같은 것을 사용할 수있다 사각형의 height 인쇄하려면 :

전화

@implementation Rectangle 

@synthesize width, height; 

-(id)initObject{ 
    if (self = [super init]) { 
     height = 5; 
     width = 7; 
    } 
    return self; 
}  

@end 

@interface Rectangle : NSObject 
{ 
    int width; 
    int height; 
} 
-(id)initObject; 

@property int width, height; 
@end 

Rectangle.m

에서 Rectangle.h에서 다음을

NSLog(@"width=%d, height=%d", [rect width], [rect height]); 
+0

도움을 주셔서 감사합니다. 지금은 정확합니다.) –

관련 문제