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
必须是实例方法,而不是类方法。谢谢