我们知道,通常我们用来在类头文件(.h)中声明我们的类实例变量,属性和方法声明。
但我们可以使用空白类别在.m文件中执行相同的操作。
所以我的问题是:什么应该在.h文件中声明,什么应该在.m文件中声明 - 以及为什么?
此致 Mrunal
新编辑:
大家好,
如果您在developer.apple.com上引用新添加的Apple示例 - 他们现在在.m文件本身中宣布他们的IBOutlets和IBActions,以及属性声明。但是我们可以通过在类私有成员部分中的.h文件中声明这些引用来实现相同的功能。
那么为什么他们在.m文件中声明那些和属性,任何想法?
-Mrunal
答案 0 :(得分:1)
但我们可以使用空白类别在.m文件中执行相同的操作。
课程延续。
通常情况下,您选择在标题中声明某些内容(如果它是公开的) - 由任何客户端使用。其他一切(你的内部)通常都应该继续上课。
我赞成封装 - 这是我的方法:
变量
属于课程延续或@implementation
。例外是非常非常罕见的。
属性
通常在实践中属于课程延续。如果你想让子类能够覆盖它们或者使这些部分成为公共接口,那么你可以在类声明(头文件)中声明它们。
方法声明
在类继续中比在类声明中更多。同样,如果它意味着被任何客户使用,它将属于类声明。通常,您甚至不需要在类继续(或类声明)中声明 - 如果它是私有的,那么单独定义就足够了。
答案 1 :(得分:0)
这主要取决于你。
.h
文件就像您班级的描述一样
只有在.h
文件中放入从课堂外看到的非常重要的内容是明智的,特别是如果你正与其他开发人员合作。
这将有助于他们更容易地理解他们可以使用的方法/属性/变量,而不是拥有他们没有的完整列表。
答案 2 :(得分:0)
基本上,在头文件(.h)中声明您的公共API,而在实现文件(.m)中声明您的私有API。
答案 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];
...
}