【问题标题】:Creating an Array from NSObject Class从 NSObject 类创建一个数组
【发布时间】:2018-06-06 08:10:39
【问题描述】:

我有一个包含 3 个属性的 NSObject 类调用 Details。

 @interface Details : NSObject

@property (nonatomic, nonnull, strong) UIImage *image; 
@property (nonatomic, assign) NSInteger number; 
@property (nonatomic, nonnull, strong) NSString *details;

- (NSDictionary *_Nonnull)getMappedDictionary; @end

这个类的实现是

@interface Details()
@property (nonatomic, nonnull) NSString *imageFormat;
@property (nonatomic, nonnull) NSData *imageData;
@end

@implementation Details

- (instancetype)init {
    if (self = [super init]) {
        _imageFormat = @"jpg";
    }
    return self;
}

- (NSData *)imageData {
    if (!_imageData) {
        _imageData = UIImageJPEGRepresentation(self.image, 1.0);
    }
    return _imageData;
}

- (NSInteger)number {
    return _number;
}

- (NSString *)details {
    return _details;
}

- (NSString *)getImageBase64 {
    NSString *base64String = @"";
    base64String = [self.imageData base64EncodedStringWithOptions:kNilOptions];
    return base64String;
}

static id ObjectOrNull(id object) {
    return object ?: [NSNull null];
}

- (NSDictionary *)getMappedDictionary {
    return @{ImageKey : ObjectOrNull([self getImageBase64]), NumberKey : @(_number), DetailKey : _details};
}

在另一个类调用请求类中,我想创建一个数组来保存详细信息类的属性(图像、数字、详细信息)

- (NSMutableSet<Details *> *)details {
    if (!_details) {
        _details = [NSMutableSet new];
    }
    return _dDetails;
}

- (NSArray *)getMappedActionDetails {
    NSMutableArray *details = [NSMutableArray new];
    for (Details *detail in self.details) {
        [details addObject:[detail getMappedDictionary]];
    }
    return details;
}

但我不能将此类的属性作为数组...我在这里缺少什么?任何帮助都是完美的!谢谢

【问题讨论】:

  • 但是问题是什么?这一切对我来说都很好。
  • 原因:'*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]:尝试从 objects[0] 插入 nil 对象'。这就是我不断得到的我不能进入这个[details addObject:[actionDetail getMappedDictionary]];@MaticOblak

标签: ios nsarray nsdictionary nsobject nsmutableset


【解决方案1】:
 -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'

表示你用 nil 创建一个字典。 objects[0] 表示您的第一个对象为零。 所以我猜当你通过这个创建字典时。

- (NSDictionary *)getMappedDictionary {
     return @{ImageKey : ObjectOrNull([self getImageBase64]), NumberKey : @(_number), DetailKey : _details};
}

ObjectOrNull([self getImageBase64]) 返回零。

【讨论】:

  • 是的,我修复了该部分,现在没有崩溃,但仍然无法创建 nsarray。当我在 Request 类中调用时,来自 Detail 类的 getMappedDictionary 方法没有显示任何内容,它一直为零。 @MaticOblak
  • 是不是因为Request类中的details属性为空?所以当你打电话给for (Details *detail in self.details) { [details addObject:[detail getMappedDictionary]];}。 self.details 是一个空集。
【解决方案2】:

从 cmets 看来,问题实际上是试图将 nil 对象插入字典:

'*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: 尝试从 objects[0] 中插入 nil 对象

提供的代码将指向getMappedActionDetails,它很可能插入了nil 对象。假设ObjectOrNull 做了它所暗示的事情,我敢打赌,在你的一个模型中_details 属性是nil。也许解决方法是:

- (NSDictionary *)getMappedDictionary {
    return @{ImageKey : ObjectOrNull([self getImageBase64]), NumberKey : @(_number), DetailKey : ObjectOrNull(_details)};
}

我还建议使用exception breakpoints 来获取崩溃的确切位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2017-05-06
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多