编译到iOS设备时出现"可变未声明"错误,但不适用于模拟器

Fel*_*ino 11 iphone compiler-errors objective-c ios xcode4

我有一个自定义的UIVIewController,它是其他控制器的基类,并且有一个自定义UIView变量的实例,可以通过继承这些类来访问它.

BaseViewController.h

@interface BaseViewController : UIViewController {
    UIView *_vwHeader;
}

@end
Run Code Online (Sandbox Code Playgroud)

BaseViewController.m

#import "BaseViewController.h"
@implementation BaseViewController

-(void)loadView {

    [super loadView];

    _vwHeader = [[UIView alloc] init];
}

@end
Run Code Online (Sandbox Code Playgroud)

CustomViewController.h

#import "BaseViewController.h"
@interface CustomViewController : BaseViewController

@end
Run Code Online (Sandbox Code Playgroud)

CustomViewController.m

#import "CustomViewController.h"
@implementation CustomViewController

- (void)loadView
{
    [super loadView];

    [_vwHeader setHidden:NO];
}

@end
Run Code Online (Sandbox Code Playgroud)

问题是,当我在模拟器上运行时,一切都运行得很好,但是当我换到设备时,我[_vwHeader setHidden:NO];在行上有一个错误,上面写着:'_vwHeader' undeclared (first use in this function)

我已经尝试过:

  • 注释这行代码,但是它在另一个类中使用基类中的变量以相同的方式给出了一个错误(它一次只返回一个错误),所以看起来它不是视图中的特定错误或者控制器类,因为错误发生在具有不同类型的其他类型中,例如UIViewNSObject类型
  • 更改目标编译器配置,例如:架构(所有这些),基本sdk(都高于4.0)没有改变任何东西

什么似乎解决了这个问题,但并不完全

  • _vwHeader通过self._vwHeadersuper._vwHeader似乎工作创建属性并访问它,但是必须创建一个属性才能访问变量并不能让我感到舒适,特别是因为我必须为我项目中相同情况下的所有变量执行此操作.
  • 更改了C/C++编译器版本:使用Apple LLVM Compiler 2.1会使编译错误消失,但是在项目中使用的其他库会产生一些其他问题.因此,它不是一个明确的解决方案,但可能是问题所在的线索.

编辑:

我试图创建另一个不是指针的变量,BOOL而不是UIView * 它,然后在继承的类中使用它:问题也会发生

编辑(2):

我的任何课程都没有任何属性,但我仍然得到错误.我刚刚添加了测试porpouses的属性,以查看父类中的属性是否导致相同的行为,显然它没有.一些奇怪的事情是,当我在变量中得到错误时,我检查了我的intellisense它发现它...

ugh*_*fhw 8

为了引用除self(包括)之外的任何对象中的实例变量super,必须使用结构指针operator(->).实例变量的默认范围是受保护的,这意味着它只能在其定义的类或该类的子类中访问.由于CustomViewController是的子类BaseViewController,这个范围足以访问使用变量self->_vwHeader,但如果你试图从做这个第二类是不是一个子类,你还需要将范围更改为@public@package.

总之,将方法调用更改为:

[self->_vwHeader setHidden:NO];
Run Code Online (Sandbox Code Playgroud)

它应该适用于基本视图控制器的任何子类.

  • @Monolo参见[参考实例变量](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocDefiningClasses.html#//apple_ref/doc/uid/TP30001163-CH12 -88281).直接从接收器以外的对象访问变量时需要它,否则可选.`self-> ivar`编译与`ivar`完全相同. (4认同)