类没有可见的@interface

时间:2015-04-30 07:36:12

标签: ios objective-c objective-c-category

我的Car.m实施文件如下。这里我有一个私人方法 engineStarting

这里我使用了类扩展概念来介绍 私有方法,我也使用Car+Maintainance作为类别。

 #import "Car.h"

//private methods

@interface Car()
-(BOOL) engineStarting;
@end


@implementation Car

@synthesize model=_model;

-(void)drive{
    NSLog(@"%@ is driving",_model);
}
-(void)stop{
    NSLog(@"%@ has stopped now",_model);
}
-(void)turnleft{
    NSLog(@"%@ is turning left",_model);
}
-(void)turnright{
    NSLog(@"%@ is turning right",_model);
}
-(BOOL) engineStarting{
    return true;
}

我的 main.m 文件看起来像

#import <Foundation/Foundation.h>
#import "Car.h"
#import "Car+Maintanance.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        // insert code here...
        NSLog(@"Hello, World!");
        Car *car=[[Car alloc]init];
        car.model=@"maruti";

        //using car its own methods
        // i am getting error in this line(no visible @interface......)
        [car engineStarting];  
        [car drive];
        [car stop];
        [car turnleft];
        [car turnright];

        //using maintainanace
        if([car neddOilChange]){
            [car changeOil];
        }

    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

正如您所说,您已经创建了私有方法-(BOOL) engineStarting,这意味着您可以在汽车类中访问它。 如果您希望在main.m文件中显示该方法,请将声明移至car.h文件,它将公开。

答案 1 :(得分:0)

你说你想私下保留-engineStarting,但是在实施之外使用它?这是相互矛盾的,因为私有意味着:&#34;在实施之外是不可见的。&#34;

可能你对这些条款搞砸了。你是对的:没有黑白私有/公共对,但是灰度:只有实现(通常称为私有),实现和子类实现(通常称为protected),才能看到某些内容一个实现和子类实现和友元类(在一个框架中,通常称为包)和public。除此之外,您还可以将方法公开给某些子系统(模块)等等。所以它非常复杂。

您可以为此做些什么,就是创建一个单独的类别,并将该类别文件的标题导入到应该可见的区域。

//Car_PublicInFrameworkAddition.h
@interface Car(PublicInFrameworkAddition)
-(BOOL) engineStarting;
@end

//Car_PublicInFrameworkAddition.m
@implementation Car(PublicInFrameworkAddition)
-(BOOL) engineStarting
{
…
}
@end

Somewhere.m

// Somewhere should see the addition
#import "Car_PublicInFrameworkAddition.h"