2012-10-19 29 views
6

Tôi đã có một vấn đề trong dự án của tôi, nơi tôi công bố trong tiêu đề nộp tài sản NSMutableDictionary như vậy:iOS, NSMutableDictionary

@property (copy, nonatomic) NSMutableDictionary *DataDict ; 

Bây giờ trong file thực hiện, tôi đi trước và khởi từ điển này vì I am gonna sử dụng nó, như vậy:

DataDict = [[NSMutableDictionary alloc]init]; 

Bây giờ khi tôi đã làm điều này, vào phút tôi cố gắng thêm một cái gì đó vào từ điển này, tôi sẽ nhận được thông báo lỗi này:

- [__ NSDictionaryI setObject: forKey:]: chọn không được công nhận gửi đến dụ 0x885ae60 2012/10/19 16: 51: 56,040 thử nghiệm [2297: C07] * Chấm dứt ứng dụng do ngoại lệ uncaught 'NSInvalidArgumentException', lý do: '- [__ NSDictionaryI setObject: forKey:]: chọn không được công nhận gửi đến dụ 0x885ae60'

Sau một thời gian và chạy qua dự án của tôi một ngàn lần, tôi quyết định bỏ ghi chú dòng khởi tạo của tôi, như vậy

//DataDict = [[NSMutableDictionary alloc]init]; 

và điều đó đã khắc phục được sự cố.

Câu hỏi của tôi là: Tại sao?

Trả lời

15

Vấn đề là theo cách bạn đã xác định thuộc tính của mình. Nếu bạn thay đổi nó thành:

@property (strong, nonatomic) NSMutableDictionary *DataDict ; 

thay vì copy mọi thứ đều ổn.

Điều này xảy ra vì về cơ bản bạn nói rằng bạn muốn bản sao đối tượng của mình thông qua người truy cập được tạo, thay vào đó trả về NSDictionary (bản sao không thể thay đổi).

Bạn có thể tìm thêm trên objective-c properties here.

Cũng giống như sidenote: ivars mục tiêu thường bắt đầu bằng chữ thường (tên viết hoa được sử dụng cho các lớp), vì vậy, nên ưu tiên dataDict hơn DataDict.

+0

Xin cảm ơn, tôi phải đọc những nội dung đó. – Kalamantina

+0

Điều đó có nghĩa là tôi nên làm cho tham chiếu mạnh mẽ, và sau đó phân bổ init? hoặc làm cho nó mạnh mẽ và không cần phải phân bổ init? – Kalamantina

+0

Bằng cách làm cho nó 'mạnh mẽ' bạn chỉ nói rằng bạn muốn giữ một mối quan hệ mạnh mẽ (sở hữu) với đối tượng đó (mà về cơ bản có nghĩa là bạn muốn nó được deallocated khi chủ sở hữu deallocates). Bạn vẫn phải phân bổ/init đối tượng như mọi khi. – Alladinian

2

Đó là vì thuộc tính có thuộc tính "sao chép" để phân bổ cá thể NSMutableDictionary/init-ed là "sao chép" bằng phương thức "sao chép" và phương thức "sao chép" không tạo NSMutableDictionary nhưng NSDictionary. ("mutableCopy" sẽ tạo NSMutableDictionary).

Có thể, bạn có thể sử dụng "giữ lại" thay vì "sao chép" làm thuộc tính.

@property (retain, nonatomic) NSMutableDictionary *DataDict ; 

Hoặc, chỉ cần không "sao chép"/"giữ lại" nhưng sử dụng ARC (tính tham chiếu tự động).

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