2

所以我在几个小时内一直在寻找为什么我的 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;

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

4

1 回答 1

3

您有一个名为speedView.

在你的方法中

- (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声明 a_ivarivar
  • 始终通过 getter/setter 访问变量,即方法self.ivar的一部分init。如果您需要直接访问 var,请使用_ivarself->_ivar

最后,这看起来有点奇怪

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

它可以替换为

self.speedCount = 1;

你确定这是你的意思吗?此外,正如其他人在评论中指出的那样,您没有使用方法参数speedView。这闻起来很糟糕,您可能需要仔细检查您的实施。

于 2013-08-14T01:30:12.503 回答