2012-05-05 1 views
1

:NSMutableArray에 NSObject 사용자 정의 하위 클래스에 포인터를 추가하는 방법은 무엇입니까? ViewController.m에서 다음 코드를 들어

CustomButton가있는 UIButton의 서브 클래스를 입력 NSObject의의 객체에 대한 포인터입니다 @property (비 원자 강한) associatedObject을 가지고 •
- (IBAction)buttonAction:(id)sender 
{ 
    CustomButton *button = (CustomButton *)sender; 
    button.associatedObject = [self.sourceOfObjects.objectArray lastObject]; 
    [self.foo.arrayOfObjects addObject:button.associatedObject]; // this does not work? 
} 

.

• sourceOfObjects는 NSObject의 하위 클래스 인 MyCustomObject 유형의 자질 (비 원자력, 강함)입니다.

• objectArray는 NSMutableArray 유형의 sourceOfObjects의 @property (비 원자력, 강함)입니다.

• foo는 NSObject의 하위 클래스 인 MyCustomObject 유형의 ViewController의 @ 속성 (비 원자력, 강함)입니다.

• arrayOfObjects는 NSMutableArray 유형의 foo의 @property (비 원자력, 강함)입니다.

질문 : 왜 button.associatedObject에서 동일한 객체를 가리키는 self.foo.arrayOfObjects에 포인터가 있도록 button.associatedObject에서 포인터를 self.foo.arrayOfObjects에 추가 할 수 없습니까?

내가 예상 한 것 : [self.foo.arrayOfObjects lastObject]를 요청하면 button.associatedObject도 가리키는 객체를 반환해야합니다.

실제로 일어난 일 : 이후 self.foo.arrayOfObjects.count를 요청하면 0이 반환됩니다. lazy instantiation을 제자리에두고 있기 때문에 arrayOfObjects를 초기화 할 때 문제가 있다고 생각하지 않습니다.

이 질문을 정확하게 표현하고 정확하도록 노력하겠습니다. :)

+0

"작동하지 않음"이란 정확히 무엇을 의미합니까? (1) 일어날 것으로 예상되는 것과 (2) 실제로 일어난 것을 설명하십시오. –

+0

수정 됨, 감사합니다. –

+3

NSLog (@ "sourceOfObjects : % @", self.sourceOfObjects.objectArray);'메소드의 시작 부분에 'NSLog (@ "foo : % @", self.foo.arrayOfObjects) 그것이 제로가 아닌지 확인하십시오. "초기화에 문제가 있다는 것을 믿지 않으므로"이 작업이 제대로 수행되어야하므로 확신 할 수없는 이유는 무엇입니까? :) – lnafziger

답변

1

MyCustomObject 클래스의 정의 내에서 self.foo.arrayOfObjects에 대한 지연 인스턴스화를 추가하는 것을 잊었습니다. :

- (void)setArrayOfObjects:(NSMutableArray *)arrayOfObjects 
{ 
    _arrayOfObjects = arrayOfObjects; 
} 

- (NSMutableArray *)arrayOfObjects 
{ 
    if (!_arrayOfObjects) _arrayOfObjects = [[NSMutableArray alloc] init]; 
    return _arrayOfObjects; 
} 

arrayOfObjects가 유유히 MyCustomObject 클래스 내에서 인스턴스화되지 않았기 때문에, ViewController.m 내에서 self.foo.arrayOfObjects에 개체를 추가 : 무슨 의미하는 것은 파일에 다음 줄이 누락 된 MyCustomObject.m이다 S self.foo.arrayOfObjects가 여전히 null이고 null에 객체를 추가하면 null 객체를 얻으므로 아무 것도하지 않습니다.

0

내가 틀릴 수도 있지만 NSObject와 모든 하위 클래스는 실제로 포인터입니다. 따라서 명시 적으로 NSObject에 대한 포인터를 만든 다음 해당 포인터를 addObject에 전달하면 포인터가 메서드에 필요한 개체에 대한 포인터가 아니라 포인터로 전달됩니다.

associatedObject은 어떻게 정의합니까?

+2

흠, 나는 그의 질문에서 그가'NSObject ** '를 저장하려고 시도하고 있다고 믿게하는 어떤 것도 보지 못했다. 무엇이 당신을이 결론에 이르게 했습니까? –

+0

이 방법으로 associatedObject 속성에 대한 설명을 해석했습니다. NSObject를 "NSObject 유형의 객체에 대한 포인터"로 언급하는 사람들은 익숙하지 않습니다. – thundersteele

+0

네, "'sourceOfObjects'는 ** NSObject *'** '타입의'self'의'@property (nonatomic, strong)'이라고 저자가 말하는 것이 더 좋았을 것입니다. 그럼에도 불구하고 그는 NSObject * 대신 NSObject *를 사용한다고 생각합니다. 따라서 포인터의 다중 레벨을 사용하려고하는 것은 의심 스럽습니다. –