Ios 在init函数中访问类的NSDictionary属性时出现错误;使用未声明的标识符";。需要帮助了解原因吗

Ios 在init函数中访问类的NSDictionary属性时出现错误;使用未声明的标识符";。需要帮助了解原因吗,ios,objective-c,Ios,Objective C,这里是一个用于一组卡片的类,这些卡片可能有几种不同的配置,我使用NSDictionary定义这些配置,其中包含字符串键和如何添加卡片的数组值。我还没有完成init函数,但在尝试访问NSDictionary属性时会出现上述错误。对于objective-c来说,这是一个相当新的问题,如果这是一个微不足道的问题,那么很抱歉 这是我的.m类文件: @interface MarioCardDeck() @property (strong, nonatomic)NSDictionary *cardConf

这里是一个用于一组卡片的类,这些卡片可能有几种不同的配置,我使用NSDictionary定义这些配置,其中包含字符串键和如何添加卡片的数组值。我还没有完成init函数,但在尝试访问NSDictionary属性时会出现上述错误。对于objective-c来说,这是一个相当新的问题,如果这是一个微不足道的问题,那么很抱歉

这是我的.m类文件:

@interface MarioCardDeck()

@property (strong, nonatomic)NSDictionary *cardConfigurations;

@end


@implementation MarioCardDeck

- (instancetype)init {
    self = [super init];

    if(self) {
        unsigned index = arc4random() % [[cardConfigurations allKeys] count]; ** error line

    }
    return self;
}

- (NSDictionary *)cardConfigurations
{
    if(!_cardConfigurations)
    {
        _cardConfigurations = @{
                                @"1" :
                                    @[@"flower",@"coin20",@"mushroom",@"star",@"oneUp",@"flower",@"oneUp",@"flower",@"coin10",@"mushroom",@"coin20",@"star",@"mushroom",@"coin10",@"star",@"mushroom",@"flower",@"star"],
                                @"2" :
                                    @[@"flower",@"coin10",@"oneUp",@"flower",@"oneUp",@"mushroom",@"star",@"mushroom",@"coin20",@"star",@"mushroom",@"coin10",@"star",@"flower",@"coin20",@"mushroom",@"flower",@"star"]
                                };

    }
    return _cardConfigurations;
}

@end

您需要通过
self.cardConfigurations

引用它。您需要:

unsigned index = arc4random() % [[self.cardConfigurations allKeys] count];
您需要使用
self
访问该属性

仅供参考-您应使用:

unsigned index = arc4random_uniform([[self.cardConfigurations allKeys] count]);
你需要改变

unsigned index = arc4random() % [[cardConfigurations allKeys] count];


然而,在Objective-C中访问init方法中的属性是一件危险的事情。如果getter在子类中被重写,您可能会得到一个可怕的惊喜。我将为索引创建另一个属性,将实例变量分配给NSNotFound,并在第一次调用getter方法时进行计算。而且您应该使用NSUInteger作为存储索引的类型。

属性是延迟加载的,因此在任何情况下直接使用ivar都不是一个好主意。在
init
中发送消息
self
也不是一个好主意。同意,但只有在子类重写属性的getter时才会成为一个潜在问题。您认为最好只需将CardConfiguration设置为类方法?如果字典从未更改,您可以将其设置为类方法来节省一些内存。有没有一种方法可以实现自我暗示?我刚开始学习,我想我在什么地方读到了关于
@synthetic
允许你不必显式声明自我?但是对我来说,
@synthesis
和使用
self
还是没有多大意义
self
用于引用调用方所在实例中的任何内容,无论是属性还是实例方法。你绕不开它。
unsigned index = arc4random() % [[self.cardConfigurations allKeys] count];