调试/发布超类/子类的构建差异

时间:2011-07-05 07:41:07

标签: objective-c ios inheritance

我有一个iOS项目,它在调试时按预期构建和执行,但在构建用于发布时会抛出编译错误。该错误与在超类中声明的iVar有关,具体是

'fetchedResultsController_' undeclared (First use in this function).

这是超类.h。

@interface Super : UIViewController <NSFetchedResultsControllerDelegate> {
    NSFetchedResultsController* fetchedResultsController_;
    NSManagedObjectContext* managedObjectContext_;
}

@property (nonatomic, retain) NSFetchedResultsController* fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext* managedObjectContext;

@end

和超类.m

@implementation Super

@synthesize fetchedResultsController = fetchedResultsController_;
@synthesize managedObjectContext = managedObjectContext_;

#pragma mark -
#pragma mark Properties

-(NSFetchedResultsController*)fetchedResultsController {
    return nil;
}

因此定义了Subclass接口: -

@interface Sub : Super <UIActionSheetDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate> {
    // extra stuff
}

在子类.m中,我为fetchedResultsController实现了延迟加载

-(NSFetchedResultsController*)fetchedResultsController {

    if (fetchedResultsController_ == nil) { // undeclared error here....
    //stuff
    }
    return fetchedResultsController_;

我很困惑,主要是因为我不明白为什么这会在Debug中加入,而不是在Release!

如果有人能够确定问题是什么,我会非常感激

1 个答案:

答案 0 :(得分:1)

这不是你问题的答案,但它会使问题消失。

就目前而言,在你的Super课程中,拥有实例变量毫无意义。您应该设置属性readOnly,以便使用它的人知道不允许设置fetchedResultController属性。事实上,人们有一个合理的期望,如果他们设置了财产,他们在阅读时会得到更多的东西。

因此,将实例变量移动到子类中。在超类中声明属性readOnly并在子类中重新声明它readWrite