2010-01-05 72 views
1

當我越來越想看到的NSMutableArray的內容時,這個錯誤:EXC_BAD_ACCESS調試

Program received signal EXC_BAD_ACCESS, Could not access memory. 
Reason: KERN_PROTECTION_FAILURE at address: 0x00000021 
0x94d5a688 in objc_msgSend() 

ViewController.h:

@interface PeopleViewController : UITableViewController { 
    NSMutableArray *people; 
} 

@property (nonatomic, retain) NSMutableArray *people; 

ViewController.m:

@implementation PeopleViewController 

@synthesize people; 

In viewDidLoad:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // initialize our people array with an autoreleased object 
    people = [NSMutableArray array]; 

... Populate the people array with Person objects. 

} 

當我在那裏,我修改了的tableview一個單元格的內容來看,我輸入「PO self.people」當我無法訪問在gdb人陣:

Person *person = [[Person alloc] init]; 
person = [self.people objectAtIndex: indexPath.row]; // <--- 'po self.people' called 
cell.textLabel.text = person.personName; 

任何想法爲什麼我無法訪問它?

回答

7

people = [NSMutableArray array]; 

返回一個autoreleased陣列將要在當前運行循環的下一次迭代中釋放。您應該保留:

people = [[NSMutableArray array] retain]; 

並且當然在您的dealloc方法中釋放它。

但是:蘋果工程師經常在會議中提到,爲了避免性能方面的原因,儘可能避免在iPhone中使用自動發佈的實例。嘗試使用alloc/init代替:

people = [[NSMutableArray alloc] initWithCapacity:1]; 

與dealloc方法中的相應版本。在這種情況下,你甚至不需要保留(init返回一個保留數爲1的實例,這是你需要的)。

和Justin的評論是正確的:你應該這樣做,而不是:

Person *person = [people objectAtIndex:indexPath.row]; 
cell.textLabel.text = person.personName; 

,這應該工作。

+0

我不認爲需要保留消息,因爲該屬性被標記爲「保留」。 – 2010-01-05 17:06:25

+3

但是這裏沒有使用屬性,實例變量直接被訪問,所以屬性沒有關係。 – jbrennan 2010-01-05 17:09:12

+0

正如jbrennan所說:self.person意味着對屬性setter方法的調用,而「person」本身就是對ivar的賦值。 – 2010-01-06 07:35:08

4

是indexPath.row> [人數]?

而且,你爲什麼這樣做:

人*人= [[人頁頭] INIT]

你分配內存,然後指向完全不同的記憶。

+0

絕對正確。一次泄漏一個實例。 – 2010-01-05 16:56:37

1

通過使用self表示法來調用由@synthesize指令創建的存取器和設置器方法,您可以避免不必要擔心保留屬性。

當您直接在viewDidLoad中設置people屬性時,它將設置屬性,但對內存管理沒有任何作用。但是,如果將其設置爲self.people,則實際上調用合成的setter方法,因爲指令的設置retain將自動保留指定的數組。

順便說一句,我建議您始終使用-[NSMutableArray initWithCapacity:]而不是裸機。它是這個類的實際初始化器。如果你不知道它有多大,你可以用'1'來調用它。在過去,我看到僅僅使用裸露的init就會出現奇怪的問題。

+0

感謝有關NSMutableArray的指定初始化程序的問題,我在我的答案中糾正了這個問題。 – 2010-01-06 07:37:07