Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 简单Objective-C属性设置错误_Ios_Objective C_Properties_Setter - Fatal编程技术网

Ios 简单Objective-C属性设置错误

Ios 简单Objective-C属性设置错误,ios,objective-c,properties,setter,Ios,Objective C,Properties,Setter,在my.h界面中: @property (nonatomic, strong) UIView *myView; 在my.m中: - (void)setMyView:(UIView *)aView { _myView = aView; //Use of undeclared identifier "_myView" } 为什么会出错 将第二个视图添加为子视图: [self.view addSubview:anotherView]; 我猜除了显式的“setter”方法之外,您还为myV

在my.h界面中:

@property (nonatomic, strong) UIView *myView;
在my.m中:

- (void)setMyView:(UIView *)aView {
    _myView = aView; //Use of undeclared identifier "_myView"
}

为什么会出错

将第二个视图添加为子视图:

[self.view addSubview:anotherView];

我猜除了显式的“setter”方法之外,您还为
myView
属性编写了自己的显式的“getter”方法

当您为属性同时提供“setter”和“getter”方法时,编译器不会自动为您生成ivar。这是有意义的,因为您的属性实现可能不使用ivar

在这种情况下,您必须声明自己的ivar。只需在.m中执行此操作:

@implementation MyClass {
    UIView *_myView;
}
这样,您就可以在“setter”和“getter”方法中引用
\u myView
ivar

另一种可能性是该属性是在父类中声明的,您正在重写该属性的“setter”方法。在这种情况下,您无法访问ivar。您需要这样做:

- (void)setMyView:(UIView *)aView {
    [super setMyView:aView];

    // do other stuff here
}

仅在头文件中声明属性
myView
,不会创建名为
\u myView
的实例变量。您需要在
@实现上添加以下内容:

@interface ClassName ()
{
    UIView *_myView;
}
@synthesize myView = _myView;
这是一个类扩展,允许您添加实例变量和属性,而不让其他类知道。然后,如果您还没有,请在
@实现
下面添加一行合成代码:

@interface ClassName ()
{
    UIView *_myView;
}
@synthesize myView = _myView;
synthesis命令创建链接到_myView实例变量的getter和setter方法。这还允许您实现自定义setter,而无需实现getter方法


希望这有帮助

你有
@synthesis
行吗?如果是,请在问题中说明。您是否也有显式的
myView
方法?您回答了错误的问题。这是关于一个名为
\u myView
的不存在变量的错误。不,我没有getter。这就是我不理解错误的原因。您是否添加了一行
@synthesis
?如果是的话,在你的问题中贴出来。不,我需要合成吗?不,你不需要。我只是想知道你有没有。好的,说得清楚一点——你有一个二传手,但没有一个getter,你没有
@synthesis
行。您使用的是什么版本的Xcode?您的基本SDK是什么?您正在使用最新的LLVM编译器吗?如果您正在重写父类中属性的“setter”,则调用
[super-setMyView:aView]
。您的类将无权访问
\u myView
属性。另外,不需要再次声明属性。是的,使用更新版本的LLVM编译器(使用更新版本的Xcode),ivar会自动为您生成。不再需要声明ivar或调用
@synthetic
。这在过去是必须的,我明白了。我没有意识到这一点,但答案仍然可能是问题的解决方案,对吗?我的意思是,我无论如何都不是专家,但有人能用我的建议来解决这个问题吗…?不,你的建议不会有帮助,原因有二。1) 显式ivar声明和显式调用
@synthetic foo=\u foo
对于现代编译器已经隐式获得的内容来说是多余的。如果且仅当OP创建了自己的“setter”和“getter”,那么显式ivar将是正确的修复方法。但事实并非如此。2) 事实证明,OP实际上覆盖了该类超类中属性的“setter”方法。所以没有必要从
@属性开始。谢谢!我只是想看看。