2011-08-26 26 views
9

Tôi có một số chức năng Dữ liệu Chính đã hoạt động tốt cho đến khi một số thay đổi gần đây (dường như không liên quan) được thực hiện. Bây giờ tôi nhận được các vấn đề mà tất cả các thuộc tính thuộc về một cá thể lớp con NSManagedObject cụ thể là đột nhiên trở về nil.Thay đổi thuộc tính Dữ liệu cốt lõi thành nil (ARC có liên quan?)

Giả sử lớp con NSManagedObject của tôi được gọi là Foo và chỉ có một thuộc tính được gọi là giá trị. Một khi tôi nhận ra giá trị bằng cách nào đó trở thành nil tôi đã đi và thiết lập các loại sau đây để theo dõi những thay đổi về giá trị.

@implementation Foo (Debug) 

- (void)setValue:(NSDate *)value 
{ 
    [self willChangeValueForKey:@"value"]; 
    [self setPrimitiveValue:value forKey:@"value"];  
    [self didChangeValueForKey:@"value"]; 
} 

- (NSDate *)value 
{ 
    [self willAccessValueForKey:@"value"]; 
    NSDate *value = [self primitiveValueForKey:@"value"]; 
    [self didAccessValueForKey:@"value"]; 

    return value; 
} 

@end 

setValue: được gọi cho đối tượng của tôi và đối số được truyền vào là NSD không phải là không Nil. Sau đó, giá trị được lấy ra (trong phương thức khác). Giá trị tương tự đã được chỉ định được truy xuất chính xác.

Tuy nhiên khi phương pháp khác cố gắng đọc giá trị, trình truy cập giá trị được gọi và giá trị nil được trả về bởi primitiveValueForKey :.

Giữa hai lần đọc setValue: không được gọi và chính đối tượng Foo vẫn hợp lệ (không phải là nil). Trên thực tế, không có hoạt động nào khác của Dữ liệu cốt lõi được thực hiện giữa hai lần đọc trên bất kỳ đối tượng Dữ liệu cốt lõi nào hoặc toàn bộ ngữ cảnh.

Chúng tôi đang sử dụng ARC trong dự án của mình. Có thể ARC bằng cách nào đó đang rối tung với các biến Dữ liệu cốt lõi của tôi và giải quyết chúng? Nếu vậy, có ai có bất cứ đề xuất nào để gỡ lỗi các thỏa thuận ARC không? Hoặc tốt hơn, không ai biết một cách để đảm bảo ARC không deallocate biến của tôi.

Điều này thậm chí có thể không phải là ARC có liên quan, tuy nhiên tôi có chút mất mát về những gì đang diễn ra. Bất kỳ đề xuất sẽ được rất nhiều đánh giá cao.

+0

ARC vẫn còn trong NDA nên chúng tôi không thể thảo luận bên ngoài diễn đàn bị hạn chế của Apple. – TechZen

+8

[ARC không thuộc NDA.] (Http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-June/015588.html) –

+0

Bất kỳ cơ hội nào bạn đang làm việc trên hai luồng khác nhau với hai luồng khác nhau bản sao của đối tượng? Nếu không, bạn có chắc đây là đối tượng chính xác không? Rằng bạn không làm hai? Hoặc bạn chưa đặt lại ngữ cảnh của mình hoặc bị mất các thay đổi ở giữa? –

Trả lời

11

này rất có khả năng vì NSManagedObjectContext mà các đối tượng này thuộc về, được đi xa. Khi bạn có NSManagedObject trường hợp xung quanh nhưng bạn không tự nắm bắt được ngữ cảnh, các đối tượng được quản lý đó sẽ bắt đầu quay trở lại nil.

Dưới ARC, đảm bảo bạn lưu trữ ngữ cảnh trong biến số strong, tức là biến số không phải là weak hoặc static toàn cầu.

Non-ARC, tức là mã lưu giữ bản phát hành, đảm bảo bạn đang giữ lại ngữ cảnh.

+0

Có ai biết tại sao điều này xảy ra không? Tôi đã có cùng một vấn đề và chỉ có thể giải quyết nó bằng cách sử dụng biến managedObjectContext của riêng tôi. Nhưng điều này là khó chịu và âm thanh giống như một lỗi. – lindinax

+0

Bạn ** cần ** để giữ ngữ cảnh. Đó không phải là lỗi. Ngữ cảnh đối tượng được quản lý làm cho hầu hết các dữ liệu lõi hoạt động. Nếu bạn không có ngữ cảnh, các đối tượng được quản lý không biết phải tương tác với cái gì. –

+0

Sử dụng ngà 'NSManagedObjectContext * mContext' sẽ không thực hiện công việc? – lindinax

0

kiểm tra các viewDidLoad-Phương pháp

profile = [NSEntityDescription insertNewObjectForEntityForName:@"MyProfile" inManagedObjectContext:profileContext]; 

hy vọng công trình này

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