2012-04-08 40 views
12

Tôi đang cố gắng để xác định những gì một giá trị trong một mảng và sau đó thực hiện thay đổi nào trên mảng, nhưng tôi không thể truy cập vào mảng ở nơi đầu tiên ...Chuyển đổi NSNumber để NSInteger

NSNumber *row = [NSNumber numberWithInt:recognizer.view.tag]; 
    NSInteger *newRow = [row integerValue]; 
    NSInteger *index = [selectedItems indexOfObject:row];//0=Not selected 1=selected; 
    NSLog(@"%@ & ",row); 
    if (index == 0) { 
     [selectedItems removeObjectAtIndex:newRow]; 
     [selectedItems insertObject:@"1" atIndex: newRow]; 
     [(UITableViewCell *)(recognizer.view) setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    } else { 
     [selectedItems removeObjectAtIndex: newRow]; 
     [selectedItems insertObject:@"0" atIndex: newRow];; 
     [(UITableViewCell *)(recognizer.view) setAccessoryType:UITableViewCellAccessoryNone]; 
    } 

Như bạn có thể thấy tôi đang cố gắng lấy thông tin từ biến hàng, đó là một NSNumber và tìm giá trị của mảng với biến chỉ mục. Ngoài ra tôi tuyên bố này trong onload của tôi() ...

selectedItems = [NSArray arrayWithObjects: 0, 0, 0, nil]; 

Vấn đề là tôi nhận được tất cả những cảnh báo này nói ...

Incompatible integer to pointer conversion initializing 'NSInteger *' (aka 'int *') with an expression of type 'NSUInteger' (aka 'unsigned int'); 

Bất cứ khi nào tôi sử dụng hàng varaibles hoặc newRow. Như bạn có thể thấy newRow chỉ là hàng như một số nguyên. Tôi đang làm gì sai?

Trả lời

42

NSInteger chỉ là kiểu gõ cho int vì vậy nó không phải là kiểu đối tượng, nó là vô hướng, bạn không phải khai báo nó làm kiểu con trỏ. Sử dụng

NSInteger newRow = [row integerValue]; 

để thay thế.

+1

+1. Chỉ muốn thêm rằng mặc dù NSInteger chỉ là một typedef cho int, nó hữu ích hơn chỉ là một int bởi vì nó sẽ chứa các kiến ​​trúc 32 bit/64-bit riêng của nó. – jmstone617

+0

Nếu tôi xóa con trỏ cho newRow và chỉ mục, tôi sẽ không nhận được cảnh báo, nhưng khi tôi chạy ứng dụng của mình, tôi gặp lỗi khi chạy mã này ... NSLog (@ "% @ &% @", newRow, index); Lỗi này là EXC_BAD_ACCESS –

+1

Tốt hơn để nghĩ về nó như là một typedef cho 'long' (ngay cả khi nó không phải là.) Kích thước của nó khác nhau tùy thuộc vào kiến ​​trúc mục tiêu. –

2

NSInteger là nguyên thủy, không phải là loại đối tượng. Các bộ sưu tập như mảng chỉ có thể chứa các đối tượng, chẳng hạn như NSNumber.

Bạn có thể nhận giá trị nguyên thủy từ phương thức sử dụng NSNumber chẳng hạn như -integerValue. Lưu ý rằng bạn thường không muốn tạo một con trỏ NSInteger (NSInteger *), bạn chỉ muốn một NSInteger.

Cũng không có điểm nào khi chụp recognizer.view.tag, tạo NSNumber từ đó, sau đó gọi -integerValue trên NSNumber đó. Chỉ cần sử dụng trực tiếp recognizer.view.tag làm giá trị số nguyên. (Bạn vẫn có thể gán nó cho biến cục bộ để truy cập nhanh.)

+0

Tôi vẫn gặp lỗi, "EXC_BAD_ACCESS" –

+0

Định dạng "% @" định dạng trong cuộc gọi NSLog mong đợi đối số của nó là con trỏ đối tượng. Để đăng nhập một số nguyên, sử dụng "% d". –

Các vấn đề liên quan