5

Tôi muốn tồn tại một khối bên trong dữ liệu lõi NSManagedObject nếu có thể. Tôi có một lớp kế thừa từ NSManagedObject. Lớp này có một khối để đáp ứng một số cuộc gọi không đồng bộ. Tôi đã cố gắng để lưu trữ các khối như là một biến thể và thuộc tính thoáng qua. khi tôi cố gắng gọi khối trước khi tải NSManagedObject của tôi, tôi có quyền truy cập bộ nhớ kém "EXC_BAD_ACCESS".Có thể lưu trữ một khối bên trong NSManagedObject không?

Nếu tôi không kiểm tra cờ năng biến Tôi có một ngoại lệ tương tự như sau:

-[__NSStackBlock__ encodeWithCoder:]: unrecognized selector sent to instance 0xbfffd930 

Tôi mới trong iOS. Tôi đang hoạt động trong SDK iOS 5 có bật ARC. Đây là một chiết xuất từ ​​mã của tôi:

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@class ModbusRegister, Board; 
typedef void (^DataBlockType)(NSArray *listRegister); 

@interface EnergyEntry : NSManagedObject 
- (void)invokeWithData: (NSArray *)listRegister; 

@property (nonatomic, copy) DataBlockType datablock; 

@end 

#import "EnergyEntry.h" 

@implementation EnergyEntry 

@dynamic datablock; 

- (void)invokeWithData: (NSArray *)listRegister{ 

    self.datablock(listRegister); 
} 

@end 

Khi tôi đã cố gắng để lưu trữ các khối:

[energyEntry setValue:@"Energía activa" forKey:@"name"]; 
[energyEntry setValue:[NSNumber numberWithDouble:0] forKey:@"value"]; 
[energyEntry setValue:currentBoard forKey:@"board"]; 

[energyEntry setValue:^(NSArray *listRegister){ 
    //...my block operations to store 
} forKey:@"datablock"]; 

Cuối cùng khi tôi gọi khối và lỗi là bắn:

NSArray *listRegister=... //my ready array 
[energyEntry invokeWithData:listRegister]; 

Trả lời

3

Bạn không thể lưu trữ một khối dưới dạng một loại có thể biến đổi. Theo Apple documentation đối tượng có thể chuyển đổi phải được chuyển đổi thành NSData. Không thể chuyển đổi khối thành NSData vì nó là tham chiếu của trình biên dịch đối với mã được biên dịch, không phải một số dữ liệu có thể được di chuyển xung quanh.

Chỉ cần lưu ý rằng khối đó giống như một phương thức ẩn danh. Bạn có thể gọi nó nhiều lần, mỗi lần với một tham số khác nhau. Vì vậy, không có gì ngăn bạn lưu trữ khối một lần và gọi nó nhiều lần trong mỗi cuộc gọi không đồng bộ một cách riêng biệt. Nếu bạn nghĩ rằng bạn cần nhiều khối thì rất có thể bạn chỉ cần lưu trữ dữ liệu cần được chuyển cho mỗi lệnh gọi khối.

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