新对象实例未运行自定义初始化程序

时间:2014-11-12 20:16:27

标签: ios objective-c cocoa-touch oop

我正在开发一个包含名为Survey的类的Singleton实例的项目。在该单例实例中是一个名为" itemArray的属性,"这是一个NSMutableArray,它包含任意数量的Item类实例。

My Items类包含几个NSInteger属性,但出于应用程序的目的,我需要初始化所有NSIntegers,其值为-1而不是默认值0.

现在,对于我的Survey类(具有Singleton实例的类),我在实现中使用以下方法来更改属性的默认值:

-(id)init {
    if (self = [super init]) {
        _thingy = -1;
        }
    return self;
}

这样可行,但出于某种原因,相同的语法(具有不同的属性)对我的Item实例的实例不起作用。对于它的价值,下面的代码块是创建2个Item实例,并将它们插入到itemArray中。我也试过了Item * item1 = [[Item alloc] init;方法无济于事。

Item *item1;
[[[Survey sharedInstance]itemArray]insertObject:item1 atIndex:0];
Item *item2;
[[[Survey sharedInstance]itemArray]insertObject:item2 atIndex:1];
}

我将不胜感激。

!!!!! UPDATE !!!!! 我输入了以下条件:

if (![[Survey sharedInstance]itemArray]){
    NSLog(@"Test");
}

"测试"登录到控制台,所以看起来itemArray没有被初始化。不过,我不确定如何实际初始化它。当我尝试以下内容时:

  [[Survey sharedInstance]addressArray] = [[NSMutableArray alloc]init];

我收到错误说"表达式不可分配。"

Survey.h:

#import <Foundation/Foundation.h>

@interface Survey : NSObject

+(instancetype)sharedInstance;

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *emailAddress;

@property (nonatomic, assign) NSInteger trigger1;
@property (nonatomic, assign) NSInteger trigger2;
@property (nonatomic, assign) NSInteger trigger3;
@property (nonatomic, assign) NSInteger activeItem;
@property (nonatomic, strong) NSMutableArray *itemArray;

@end

Survey.m

#import "Survey.h"

@implementation Survey


+ (instancetype)sharedInstance {
    static Survey *_instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[Survey alloc] init];
    });
    return _instance;
}

-(id)init {
    if (self = [super init]) {
        _storage = -1;
        }
    return self;
}

@end

1 个答案:

答案 0 :(得分:1)

而不是

 [[Survey sharedInstance]addressArray] = [[NSMutableArray alloc]init];

你需要使用

 [Survey sharedInstance].addressArray = [[NSMutableArray alloc]init];

[[Survey sharedInstance] setAddressArray:[[NSMutableArray alloc]init]];

您试图为getter方法的返回值赋值,这是不可能的,因此编译器说&#34;表达式不可分配。&#34;您需要使用setter方法或点符号。