何时在类别.m文件或​​头文件.h文件中声明某些内容?

时间:2013-02-28 11:17:34

标签: ios objective-c scope objective-c-category variable-declaration

我们知道,通常我们用来在类头文件(.h)中声明我们的类实例变量,属性和方法声明。

但我们可以使用空白类别在.m文件中执行相同的操作。

所以我的问题是:什么应该在.h文件中声明,什么应该在.m文件中声明 - 以及为什么?

此致 Mrunal

新编辑:

大家好,

如果您在developer.apple.com上引用新添加的Apple示例 - 他们现在在.m文件本身中宣布他们的IBOutlets和IBActions,以及属性声明。但是我们可以通过在类私有成员部分中的.h文件中声明这些引用来实现相同的功能。

那么为什么他们在.m文件中声明那些和属性,任何想法?

-Mrunal

4 个答案:

答案 0 :(得分:1)

  

但我们可以使用空白类别在.m文件中执行相同的操作。

课程延续。

通常情况下,您选择在标题中声明某些内容(如果它是公开的) - 由任何客户端使用。其他一切(你的内部)通常都应该继续上课。

我赞成封装 - 这是我的方法:

  

变量

属于课程延续或@implementation。例外是非常非常罕见的。

  

属性

通常在实践中属于课程延续。如果你想让子类能够覆盖它们或者使这些部分成为公共接口,那么你可以在类声明(头文件)中声明它们。

  

方法声明

在类继续中比在类声明中更多。同样,如果它意味着被任何客户使用,它将属于类声明。通常,您甚至不需要在类继续(或类声明)中声明 - 如果它是私有的,那么单独定义就足够了。

答案 1 :(得分:0)

这主要取决于你。

.h文件就像您班级的描述一样 只有在.h文件中放入从课堂外看到的非常重要的内容是明智的,特别是如果你正与其他开发人员合作。

这将有助于他们更容易地理解他们可以使用的方法/属性/变量,而不是拥有他们没有的完整列表。

答案 2 :(得分:0)

基本上,在头文件(.h)中声明您的公共API,而在实现文件(.m)中声明您的私有API。

Visibility in Objective-C

You can also find the answer here

答案 3 :(得分:0)

通常,您希望在.m文件中使用空白类别来声明私有属性。

// APXCustomButton.m file
@interface APXCustomButton ()

@property (nonatomic, strong) UIColor *stateBackgroundColor;

@end

// Use the property in implementation (the same .m file)
@implementation APXCustomButton

- (void)setStyle:(APXButtonStyle)aStyle
{
    UIColor *theStyleColor = ...;
    self.stateBackgroundColor = theStyleColor;
}

@end

如果您尝试访问.m文件外的黑色类别中声明的属性,您将收到未声明的属性编译器错误:

- (void)createButton
{
    APXCustomButton *theCustomButton = [[APXCustomButton alloc] init];
    theCustomButton.stateBackgroundColor = [UIColor greenColor]; // undeclared property error
}

在大多数情况下,如果要在不进行子类化的情况下向现有类添加新方法/属性,则需要在.h文件中声明类别并在.m文件中声明已声明方法的实现

// APXSafeArray.h file
@interface NSArray (APXSafeArray)

- (id)com_APX_objectAtIndex:(NSInteger)anIndex;

@end

// APXSafeArray.m file
@implementation NSArray

- (id)com_APX_objectAtIndex:(NSInteger)anIndex
{
    id theResultObject = nil;
    if ((anIndex >= 0) && (anIndex < [self count]))
    {
        theResultObject = [self objectAtIndex:anIndex];
    }

    return theResultObject;
}

@end

现在,只要导入“APXSafeArray.h”,就可以使用“com_APX_objectAtIndex:”方法。

#import "APXSafeArray.h"

...

@property (nonatomic, strong) APXSafeArray *entities;

- (void)didRequestEntityAtIndex:(NSInteger)anIndex
{
    APXEntity *theREquestedEntity = [self.entities com_APX_objectAtIndex:anIndex];
    ...
}