【问题标题】:Difference between @interface definition in .h and .m file.h 和 .m 文件中的@interface 定义之间的区别
【发布时间】:2011-04-27 09:37:42
【问题描述】:

我们通常使用

@interface interface_name : parent_class <delegates>
{
......
}
@end 

.h 文件和.m 文件中的方法我们综合了.h 文件中声明的变量的属性。

但在某些代码中,@interface.....@end 方法也保存在 .m 文件中。这是什么意思?它们有什么区别?

同时给出一些关于 .m 文件中定义的接口文件的 getter 和 setter...

提前致谢

【问题讨论】:

    标签: objective-c interface header-files setter getter


    【解决方案1】:

    添加一个额外的@interface 来定义一个包含私有方法的类别是很常见的:

    Person.h:

    @interface Person
    {
        NSString *_name;
    }
    
    @property(readwrite, copy) NSString *name;
    -(NSString*)makeSmallTalkWith:(Person*)person;
    @end
    

    Person.m:

    @interface Person () //Not specifying a name for the category makes compiler checks that these methods are implemented.
    
    -(void)startThinkOfWhatToHaveForDinner;
    @end
    
    
    @implementation Person
    
    @synthesize name = _name;
    
    -(NSString*)makeSmallTalkWith:(Person*)person
    {
        [self startThinkOfWhatToHaveForDinner];
        return @"How's your day?";
    }
    
    
    -(void)startThinkOfWhatToHaveForDinner
    {
    
    }
    
    @end
    

    “私有类别”(无名类别的正确名称不是“私有类别”,而是“类扩展”).m 防止编译器警告方法已定义。但是,由于 .m 文件中的 @interface 是一个类别,因此您无法在其中定义 ivars。

    2012 年 8 月 6 日更新:自编写此答案以来,Objective-C 已经发展:

    • ivars 可以在类扩展中声明(并且总是可以 - 答案不正确)
    • @synthesize 不是必需的
    • ivars 现在可以在 @implementation 顶部的大括号中声明:

    也就是说,

    @implementation { 
         id _ivarInImplmentation;
    }
    //methods
    @end
    

    【讨论】:

    • 小旁注,声明私有接口时不要在括号内实际放任何东西。否则,它只会创建一个类别,而您不希望这样做。 @interface Person () 就足够了。
    • 谢谢 itaiferber,我没有注意到这一点。我已经更新了我的答案。
    • 如果人们有兴趣了解更多关于类别的信息。这个page 对我非常有用。
    • 如果括号中没有任何内容,那么这实际上称为class extension 而不是category
    • @giant91 这个答案相当陈旧,编译器自最初编写以来已经有了很大的改进。如果方法主体是“可见的”,则编译器不再需要方法声明。这意味着类延续 (@interface className ()) 现在通常只会包含私有 @propertys。
    【解决方案2】:

    这个概念是,如果你可以让你的项目更干净 将 .h 限制为类的公共接口,然后放 此类扩展中的私有实现细节。

    当你在 ABC.h 文件中声明变量方法或属性时,它 意味着这些变量的属性和方法可以在外部访问 类

    @interface Jain:NSObject
    {
        NSString *_name;
    }
    
    @property(readwrite, copy) NSString *name;
    -(NSString*)makeSmallTalkWith:(Person*)jain;
    @end
    

    @Interface 允许您声明私有 ivars、属性和 方法。因此,您在此处声明的任何内容都无法从外部访问 这节课。通常,您要声明所有 ivars、属性和 方法默认为私有

    简单说当你在 ABC.m 中声明变量方法或属性时 file , 表示这些变量的属性和方法不能 课外访问

    @interface Jain()
        {
            NSString *_name;
        }
    
        @property(readwrite, copy) NSString *name;
        -(NSString*)makeSmallTalkWith:(Person*)jain;
        @end
    

    【讨论】:

      【解决方案3】:

      您甚至可以在 .m 文件中创建其他类, 例如,从 .h 文件中声明的类继承但行为略有不同的其他小类。 您可以在工厂模式中使用它

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 1970-01-01
        • 1970-01-01
        • 2020-10-20
        相关资源
        最近更新 更多