2011-10-28 20 views
7

Khi tôi xóa một đối tượng quản lý có chứa hình ảnh, lưu trữ như giá trị năng biến trong hồ sơ bên ngoài, sau đó tôi đã sụp đổ và lỗi này:Lỗi: - [UIImage _deleteExternalReferenceFromPermanentLocation] selector không được công nhận gửi đến dụ

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIImage _deleteExternalReferenceFromPermanentLocation]: unrecognized selector sent to instance 0xde49360' 

Trả lời

12

Tôi đã trả lời một điều tương tự trong số Apple Developer forums.
Tôi đoán bạn có hộp kiểm bộ nhớ ngoài được chọn trên trường đó trong trình chỉnh sửa dữ liệu.

Có một lỗi trong đó có thể được làm việc xung quanh. Tôi đã làm như thế này:
Khi bạn đã cập nhật dữ liệu của mình và lưu ngữ cảnh, mọi nỗ lực xóa nó sẽ làm tăng ngoại lệ 'bộ chọn không được công nhận' này.
Buộc thực hiện đúng đối tượng, có thể đáp ứng với thông điệp _deleteExternalReferenceFromPermanentLocation, làm điều này:

[[self managedObjectContext] refreshObject:myobject mergeChanges:NO]; 

Đối tượng biến thành một lỗi. Khi bạn truy cập tiếp theo hoặc xóa nó, dữ liệu bên ngoài sẽ bị xóa như mong đợi vì đối tượng chính xác kết thúc tốt dữ liệu ngoài của bạn sẽ được lấy ra khỏi cửa hàng và sẽ trả lời chính xác tới _deleteExternalReferenceFromPermanentLocation.

+0

Hoạt động như một sự quyến rũ, cảm ơn bạn rất nhiều !!! – Shmidt

+0

Đây cũng là một vấn đề đối với loại dữ liệu lõi "Dữ liệu nhị phân" (có "Cho phép lưu trữ bên ngoài") hay chỉ là một vấn đề cho "Biến đổi"? – Hope4You

2

Các phương tiện UIImage không phản hồi:

_deleteExternalReferenceFromPermanentLocation 

… bộ chọn có nghĩa là UIImage không triển khai phương pháp cụ thể đó. Đây dường như là một trong những phương pháp riêng mà Core Data sử dụng để lưu trữ các khối dữ liệu lớn trong các tệp bên ngoài. Đó là một chức năng chỉ có sẵn trong iOS 5.

Trong trường hợp này có hai nguyên nhân có khả năng nhất:

(1) Bạn đã nhầm lẫn một đối tượng UIImage với một đối tượng hoặc ngược lại được quản lý như vậy mà một thông điệp dành cho một lớp được gửi tới một lớp khác (đó là nguyên nhân phổ biến nhất của lớp lỗi này.)

(2) Bạn đang cố chạy mã được biên dịch cho iOS 5 trong iOS trước đó trong trình mô phỏng hoặc thiết bị.

+0

Tôi có thuộc tính có thể biến đổi, trong đó tôi lưu trữ UIImage thông qua NSValueTransformer ... Khi tôi hiểu tôi cần thay đổi thuộc tính này thành NSData để tránh thông báo lỗi này – Shmidt

2

Tôi cũng gặp sự cố này với thuộc tính dữ liệu lõi NSDate. Tôi không cần nó được lưu trữ bên ngoài, nhưng không thể tìm thấy bất kỳ hộp kiểm nào để bỏ đặt (Xcode 4.2). Tuy nhiên, rõ ràng là ở đó khi tôi ack chỉnh sửa cho nó:

> ack -aiQ external Collections.xcdatamodeld 
Collections.xcdatamodeld/Collections.xcdatamodel/contents 
12:  <attribute name="createdAt" attributeType="Date" allowsExternalBinaryDataStorage="YES" indexed="YES" syncable="YES"/> 

Vì vậy, tôi vừa xóa và tạo lại thuộc tính đó có cùng tên. Thuộc tính XML allowsExternalBinaryDataStorage đã biến mất và do đó sự cố của tôi đã bị hỏng. Tôi đã vô tình kiểm tra một cái gì đó trong một bản phát hành beta của iOS 5 hoặc một cái gì đó và nó chỉ bị mắc kẹt trong mô hình dữ liệu, lặng lẽ đợi cho đến khi tôi cố gắng xóa một đối tượng.

Dù sao, có lẽ điều này sẽ giúp những người khác gặp phải lỗi iOS nhưng không cần thuộc tính được đề cập để được lưu trữ bên ngoài.

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