2012-10-15 4 views
0

Obj-C의 메모리 및 그 개념의 일부를 이해하는 데 여전히 어려움이 있습니다.NSMutableArray는 항상 비어 있습니까?

그래서 내 메인 클래스에는 일부 문자와 무기 목록이 포함 된 NSMutableArray이 포함되어 있습니다. 그것은 다음과 같이이다 :

홈페이지 class.m의 init 주요 class.h

@property (nonatomic, retain) NSMutableArray *players; 

에서

for(int i = 0 ; i < 30 ; i++) 
{ 
    [players addObject:[[PlayerInGame alloc] init:[self.tabPlayers objectAtIndex:i] :[self.tabWeapons:objectAtIndex:i]]]; 
} 

PlayerInGame.h

@property (nonatomic, retain) NSMutableArray *weaponsList; 

PlayerInGame.m

- (id) init : (Player*) player : (Weapon*) weapon 
{ 
    [self.weaponsList addObject:weapon]; 
    // Then I try NSLog of weaponsList's count. 
} 

여기 weaponsList 항상 비어 있습니다. 뭐가 잘못 되었 니?

+0

의 중복 가능성 [빈있는 NSMutableArray, 확실하지 않은 이유 (http://stackoverflow.com/questions/11632308/empty-nsmutablearray-not-sure-why) – Vladimir

답변

3

다른 답변은 맞습니다. 할당되지 않은 객체를 참조하면 다른 언어에서 NullPointerException이 발생합니다. 그러나 객관적인 C에 this

이유

[self.weaponsList addObject:weapon]; 

충돌하지 않았다 반면, 전무로 전송하는 방법은 0 반환하고이 응용 프로그램을 중단하지 않습니다 .. 읽고 더 원하는 경우 읽기 다른 답변이 지적한 것처럼 자바는 저장 배열에 문을 .. 프로그램이 충돌하는 할당되지 않은 배열에 개체를 추가

self.weaponsList = [[[NSMutableArray alloc] init] autorelease]; 

ALLOC 메모리를 시도하는 경우, 및 참조는 변수 weaponList 다시 주어집니다. 지금 weaponList! = nil. 나는 끄트머리

+1

주어진 해결 방법이 정확하지만 설명이 잘못되었습니다. nil은 런타임에 유효한 객체로 간주되므로 nil에 전송 된 모든 메시지는 반환 값 0 (또는 이와 동등한 nil)과 함께 즉시 반환되기 때문에 예외가 발생하지 않습니다. 따라서 [nil count]는 0을 반환합니다. – JeremyP

2

weaponList 개체 할당을 보지 못했습니다. 초기화 하시겠습니까?

추 신 : 경미한 조언. 방법 "- (ID) 초기화 : (플레이어 *) 플레이어 : (무기 *) 무기는"서명은 더 나은 모양과 당신은 어떤 개체를 추가하기 전에 배열을 ALLOC해야

- (id) initWithPlayer:(Player *)player weapon:(Weapon *)weapon 
3

로 변경하면 쉽게 사용 그 안에. viewDidLoad 방법에서 다음 코드를 사용할 수 있습니다

NSMutableArray *players = [[NSMutableArray allo]init]; 
NSMutableArray weaponsList = [[[NSMutableArray alloc] init] 
2

조금 당신의 초기화 구문을 변경하는 것이 좋습니다와 객체 배열을 초기화하기 :

- (id) initWithPlayer:(Player *)aPlayer weapon:(Weapon *)aWeapon { 
    self.weaponsList = [NSMutableArray arrayWithObject:aWeapon]; 
    [self.weaponsList retain]; 
    // remember to release inside dealloc, or use autorelease 
} 
관련 문제