“速度视图”的本地声明隐藏了实例变量

时间:2013-08-14 01:27:52

标签: iphone ios objective-c

所以我几个小时后一直在寻找为什么我的iPhone应用程序讨厌我。这是我得到的错误: 警告:'speedView'的本地声明隐藏了实例变量。 这是我的.m文件

@implementation MainViewController
@synthesize speedCount;
@synthesize speedView;
@synthesize popoverController;

- (void)setspeedView:(UILabel *)speedView
{
    [speedView setText: [NSString stringWithFormat:@"%d",speedCount]];
    speedCount = 0;
    speedCount++;
}

.h文件

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface MainViewController : UIViewController <LoginDelegate,WEPopoverParentView,PopoverControllerDelegate,MainMenuDelegate,MKMapViewDelegate,UIActionSheetDelegate,UIAccelerometerDelegate, CLLocationManagerDelegate>
{
    AppDelegate *appDelegate;
    IBOutlet MKMapView *userMap;
    IBOutlet UILabel *speedView;
    CLLocationManager *locationManager;
}

@property (strong, nonatomic) IBOutlet UILabel *speedView;
@property(nonatomic) int speedCount;

我真的不明白为什么它说我隐藏了实例变量。

1 个答案:

答案 0 :(得分:3)

您有一个名为speedView的ivar(实例变量)。

在你的方法中

- (void)setspeedView:(UILabel *)speedView

speedView是一个局部变量,其名称与ivar冲突。

如果您使用的是现代版本的编译器,请删除@synthesize指令。

它将由编译器以这种形式自动添加

@synthesize speedView = _speedView

将创建ivar _speedView,其名称不会与局部变量发生冲突。

另请注意,声明实例变量和属性都是多余的。 ivar将由(隐式)@synthesize指令自动创建。

这是你班级的“现代”版本:

·H

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface MainViewController : UIViewController <LoginDelegate,WEPopoverParentView,PopoverControllerDelegate,MainMenuDelegate,MKMapViewDelegate,UIActionSheetDelegate,UIAccelerometerDelegate, CLLocationManagerDelegate>

@property (strong, nonatomic) IBOutlet UILabel *speedView;
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) IBOutlet MKMapView *userMap;
@property (strong, nonatomic) AppDelegate *appDelegate;
@property (nonatomic) int speedCount;

的.m

@implementation MainViewController

- (void)setspeedView:(UILabel *)speedView {
    [speedView setText:[NSString stringWithFormat:@"%d", self.speedCount]];
    self.speedCount = 0;
    self.speedCount++;
}

请注意:

  • 属性很好:只要你能
  • 就使用它们
  • @synthesize是隐含的
  • @sythesize的隐式版本为属性_ivar声明ivar
  • 始终通过getter / setter访问变量,即self.ivar,来自init方法的一部分。如果您需要直接访问var,请使用_ivarself->_ivar

作为最后的评论,这看起来有点奇怪

self.speedCount = 0;
self.speedCount++;

它可以替换为

self.speedCount = 1;

你确定这是你的意思吗?此外,如其他人的评论中所述,您未使用方法参数speedView。这闻起来很糟糕,你可能想要仔细检查你的实现。