2014-04-07 3 views
0

매우 이상한 문제가 있습니다. 첫 번째 클래스에는 객체를 배열에 추가하는 메서드가 포함 된 NSObject 클래스의 하위 클래스가 있습니다. (주식 보유 *) 주식, 내가 (런타임) 다음과 같은 오류가 발생합니다 : :NSObject에서 속성 및 메서드에 액세스 할 수 없습니다.

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
    reason: '-[NSObject addStockObject:]: unrecognized selector 
    sent to instance 0x8b48d90' 

호출 코드 - (무효) addStockObject 그래서 난 메소드를 호출

#import "portfolio.h" 

    @implementation portfolio 


    -(void) addStockObject:(stockHolding *)stock 
    { 
     [self.stocks addObject:stock ]; 
    } 

    +(portfolio *) alloc 
    { 
     return [self.superclass alloc]; 
    } 

    -(portfolio *) init 
    { 
     self.stocks=[[NSMutableArray alloc]init]; 
     return self; 
    } 

    -(NSString *)getCurrentValue 
    { 

     stockHolding *stockInArray; 
     float currentValue=0.0; 

     for (NSInteger *i=0; i<[self.stocks count]; i++) { 
      stockInArray = [self.stocks objectAtIndex:i]; 
      currentValue+=stockInArray.currentValue; 

     } 
     return [NSString stringWithFormat:@"Current Value: %f",currentValue]; 
    } 
    @end 

: 아래의 코드를 참조하십시오 다음과 같습니다 :

 p=[[portfolio alloc]init]; 
    [p addStockObject:s]; 
    portfolio *p; 

아무도 저에게 무엇이 잘못 되었습니까?

다른 클래스에는 속성이 있으며 컴파일하는 동안 액세스 할 수없는 것으로 보입니다. 나는 정말로 혼란 스럽다.

는 미사

+1

이름 지정 규칙을 따르고 대문자로 시작하는 클래스를 시작하십시오. 예를 들어'portfolio' 클래스는'Portfolio' 여야합니다. – NobodyNada

답변

2

첫째, 결코 +(portfolio *) alloc를 오버라이드 (override) 감사합니다.

두 번째로, init 메소드는 다른 init 메소드를 호출해야하며, nil에 대해 항상 self을 확인하여 ivars를 설정해야합니다. Apple은 속성을 사용하여 초기화 메소드에서 ivars를 설정하지 말 것을 권장하며, init 메소드는 항상이를 지원하는 컴파일러에서 instancetype을 반환하고, 그렇지 않은 경우 id을 반환해야합니다.

-(instancetype) init 
{ 
    self = [super init]; 
    if (self) 
    { 
     _stocks = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 
+0

'NSObject'의 직접 하위 클래스에'init'을 호출하는 것은 기술적으로 필요하지 않습니다. 단지 좋은 습관 일뿐입니다. 그러나'alloc '을 없애는 것이 중요하다. –

+0

흠, 직접적인 하위 클래스에는 필요 없다는 말을 들어 본 적이 없습니다. 그 반대 편을위한 참고 자료가 있습니까? 네가 말했듯이, 그건 좋은 습관이야. – BergQuester

+0

'NSObject' docs에서 : "NSObject 클래스에 정의 된 init 메소드는 초기화를하지 않으며 단순히 자체를 반환합니다." –