从子类访问父类实例变量

3

我已经学习了几周的Objective C,针对iPhone应用开发。今天我收到了我的配置文件,想把我的应用程序放在我的手机上。然而,当我将其构建为我的iPhone版本时,我得到了一系列相同类型的错误:

error: 'itemPickerView' undeclared (first use in this function)

当我在模拟器中构建时,这种情况不会发生。

所有错误都发生在单个类实现文件(ProjectSettingsController)中,该文件扩展了DetailController。

我有其他两个类也扩展了DetailController,并使用与ProjectSettingsController相同的实例变量,但它们不会导致错误。

ProjectSettingsController略有不同,因为它管理的视图从未直接添加到导航控制器中,但是编译器在此时不会知道这一点,在模拟器上(运行IOS 4.3),它可以正确地工作。

我想我的问题有两个方面:

  1. 为什么在向设备编译时会给我一个编译器错误,而在向模拟器编译时不会?

  2. 为什么它只在这一个类中给我这个错误?

以下是DetailController的.h文件:

@interface DetailController :      UITableViewController<UIPickerViewDelegate,UIPickerViewDataSource>  {
    NSMutableDictionary * data;
    NSMutableArray * dataOrder;
    NSMutableDictionary * objectToData;
    UIDatePicker * pickerView;
    UIPickerView * itemPickerView;
    UIBarButtonItem * doneButton;
    UIBarButtonItem  *  savedRightButton;
    UIBarButtonItem  *  savedLeftButton;
    UIBarButtonItem * insertButton;
    UIView * slidingView;
    UITextView * textView;
    BOOL isEditing;
}

这里是ProjectSettingsController的.h文件。
#import <UIKit/UIKit.h>
#import "DetailController.h"
#import "Project.h"
#import "Task.h"
@class ProjectController;

@interface ProjectSettingsController : DetailController{
}
@property (nonatomic, retain) ProjectController* parent;
@property (nonatomic, retain) UINavigationController * navigationController;
@property (nonatomic, retain) UINavigationItem * navigationItem;
@property (nonatomic, retain) Project* project;

ProjectController被声明为一个类,而不是被包含进来,因为它已经包含了这个类。我尝试将DetailController添加为@class,但它没有任何作用,正如我所预期的那样。

以下是ProjectSettingsController.m中有问题的代码片段:

int hours = [itemPickerView selectedRowInComponent: 0] + 1;

这是TaskController的.h文件,它可以正常工作。
#import "DetailController.h"
#import "Task.h"
#import "Project.h"
#import "CompletionSlider.h"

@interface TaskController : DetailController{

}

这是来自 TaskController.m 的一段有效代码示例:

[itemPickerView selectedRowInComponent:0]+1]

我已经花费了约2个小时来查看这两个文件的细节,但无法找到任何导致此情况发生的原因。
我是否应该更改代码以使用属性?这将意味着需要在所有这些变量前面加上super.并浏览我的代码吗?不能从子类中访问实例变量似乎很荒谬(尤其是因为我似乎可以访问方法?!)
期待您告诉我错过的愚蠢之处。

self. 不是 super..... 另外,Objective-C 有"实例变量",而不是"成员变量"。这只是一个小细节,但它会帮助您阅读文档时保持清晰。 - bbum
谢谢提醒,但是由于实例变量属于父类而不是类本身,所以应该使用super.,我知道self.也可以。 - Zack Newsham
1
我不知道为什么这个不起作用,但通常我会尽量避免直接访问实例变量,特别是超类的实例变量。如果我是你,我会把所有这些实例变量转换成声明的属性,删除实例变量的声明,并使用合成的访问器/实例变量代替。 - Daniel Dickison
4
@Zack Newsham:super并不是与self分离的东西——它们都是指代当前对象的方式。编写superself之间唯一的区别在于,当您将super用作消息接收者时(例如,[super doSomething]),运行时会跳过当前类中实现的方法,以尝试将该消息解析为方法调用。在消息发送之外编写super是没有意义的。 - Chuck
你能展示一下 ProjectSettingsController.m 中有问题的代码片段周围的更多上下文吗?你是在尝试在 ProjectSettingsController 类实现之外引用 itemPickerView 吗?我不知道为什么你会在设备上出现错误而在模拟器上没有...就好像 ProjectSettingsController 可能被遗漏在构建中一样。 - jlstrecker
1个回答

1
通常情况下,当你更改构建目标为模拟器或设备时,你需要更改所导入或包含的系统头文件的来源。这些头文件的差异可能会影响模拟器或设备构建之间的区别。
每当你突然遇到编译错误列表时,请关注第一个错误。通常一个单独的错误可能会引起更多的错误,很快就会形成一个巨大的错误列表。有时解决第一个错误可以解决其余所有错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接