Ios 如何在init中初始化目标C类变量?

Ios 如何在init中初始化目标C类变量?,ios,objective-c,constructor,Ios,Objective C,Constructor,在@界面中,我有以下声明: @interface myClass { NSDictionary * myData; } @property (nonatomic, assign) NSDictionary * data; + (id) initWithData:(NSDictionary *)data; @end 在@实现中,我有以下代码: @implementation @synthesize data; + (id) initWithData:(NSDictionary *)

@界面
中,我有以下声明:

@interface myClass {
   NSDictionary * myData;
}

@property (nonatomic, assign) NSDictionary * data;
+ (id) initWithData:(NSDictionary *)data;

@end
@实现中
,我有以下代码:

@implementation

@synthesize data;

+ (id) initWithData:(NSDictionary *)freshData {
    self = [super init];
    if (self) {
        self->data = freshData;
    }
    return self;
}

@end
但是我在
self->data
上得到了类型'struct objc_class的错误
不完整定义

如果我将其更改为
self.data
,则得到错误
成员引用类型“struct objc_class*”是指针;您的意思是使用“->”吗?

如果我删除
self
,我会得到错误“实例变量”数据“在类方法中访问”

但是如果我将方法类型从
+
(类方法)更改为
-
(实例方法),我将无法访问init

我也无法通过将赋值从
data
更改为
myData
来修复此错误

我应该如何创建构造函数

我从以下链接中学到(但没有帮助):


不要使用公共init方法(+)

改为

- (instancetype) initWithData:(NSDictionary *)data;
我强烈建议您使用
instancetype
而不是
id
(
)

不要使用公共init方法(+)

改为

- (instancetype) initWithData:(NSDictionary *)data;
我强烈建议您使用
instancetype
而不是
id
(
)你也可以这样做

+ (id) initWithData:(NSDictionary *)freshData {
    return [[self alloc]initWithData:freshData];
}
- (instancetype) initWithData:(NSDictionary *)freshData {

    NSParameterAssert(freshData != nil);

    self = [super init];

    if (self) {
        self.data = freshData;
    }

    return self;
}

你也可以这样做

+ (id) initWithData:(NSDictionary *)freshData {
    return [[self alloc]initWithData:freshData];
}
- (instancetype) initWithData:(NSDictionary *)freshData {

    NSParameterAssert(freshData != nil);

    self = [super init];

    if (self) {
        self.data = freshData;
    }

    return self;
}

通常,我不希望
init*
方法是类方法。通常,您有一个名为
default*
shared*
*with dictionary:
的类方法。因此,对于名为
myClass
的类,我希望看到以下内容:

+ (myClass*)myClassWithDictionary:(NSDictionary*)dict
{
    return [[myClass alloc] initWithDictionary:dict];
}

例如,当静态分析器分析代码时,这可能很重要。命名在Objective-C中非常重要,并向编译器(和分析器)提示代码的意图。

一般来说,我不希望
init*
方法是类方法。通常,您有一个名为
default*
shared*
*with dictionary:
的类方法。因此,对于名为
myClass
的类,我希望看到以下内容:

+ (myClass*)myClassWithDictionary:(NSDictionary*)dict
{
    return [[myClass alloc] initWithDictionary:dict];
}

例如,当静态分析器分析代码时,这可能很重要。命名在Objective-C中很重要,并向编译器(和分析器)提示代码的意图。

如果我只实现
-(instancetype)initWithData:(NSDictionary*)freshData
而不实现
+(id)initWithData:(NSDictionary*)freshData
,那么缺点是什么呢?您也可以这样做,如果在创建该类的对象时没有任何问题,就像在实例方法中一样,您需要创建该类的对象以使用该方法,而在类方法中,您可以使用类调用该方法。对于类方法与实例方法,请检查这一点-如果我只实现
-(instancetype)initWithData:(NSDictionary*)freshData
没有
+(id)initWithData:(NSDictionary*)freshData
,有什么缺点?如果创建该类的对象没有任何问题,您也可以这样做,对于实例方法,您需要创建该类的对象以使用该方法,对于类方法,您可以使用类调用该方法。对于类方法与实例方法,也可以检查这一点-您的意思是像
[uicolorWithCgColor:
?是的,这就是我的意思。好的,我想我知道我不能访问实例init方法构造函数是怎么回事。。。我忘了在
init
之前先做
alloc
。这就是为什么如果我将
init
更改为类构造函数,我只能访问
init
方法,因为我立即编写了
[MyClass initWithData://code>。我已经习惯了快速简单,当我不得不回到目标C时,我有点忘记了练习。。。然后你的回答提醒了我为什么
init
必须是实例方法,而不是类方法。谢谢你的意思是像
[uicolorWithCGcolor:
?是的,这就是我的意思。好的,我想我知道我不能访问实例init方法构造函数是怎么回事。。。我忘了在
init
之前先做
alloc
。这就是为什么如果我将
init
更改为类构造函数,我只能访问
init
方法,因为我立即编写了
[MyClass initWithData://code>。我已经习惯了快速简单,当我不得不回到目标C时,我有点忘记了练习。。。然后你的回答提醒了我为什么
init
必须是实例方法,而不是类方法。谢谢