Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 什么';@interface和@implementation在.h或.c中的区别是什么_Objective C - Fatal编程技术网

Objective c 什么';@interface和@implementation在.h或.c中的区别是什么

Objective c 什么';@interface和@implementation在.h或.c中的区别是什么,objective-c,Objective C,我正在Kobold2D示例项目(基于正交瓷砖的游戏)中使用一些代码,我注意到: @interface TileMapLayer : CCLayer //Map { float tileMapHeightInPixels; //depricated@interface TileMapLayer() } @end 在TileMapLayer.h文件中,以及: @interface TileMapLayer() @property (strong) HUDLayer *hud; @pro

我正在Kobold2D示例项目(基于正交瓷砖的游戏)中使用一些代码,我注意到:

@interface TileMapLayer : CCLayer //Map
{
    float tileMapHeightInPixels; //depricated@interface TileMapLayer()  
}
@end
在TileMapLayer.h文件中,以及:

@interface TileMapLayer()
@property (strong) HUDLayer *hud;
@property (strong) CCTMXTiledMap *tileMap;
@property (strong) CCTMXLayer *background;
@property (strong) CCTMXLayer *foreground;
@property (strong) CCTMXLayer *meta;
@property (strong) CCTMXLayer *base;
@property (strong) CCSprite *player;
@property (strong) CCSprite *playerTurret;
@property (assign) int money;
@end
在TileMapLay.m文件中

我一直认为
.h
文件保存接口,
.m
文件存储实现


有人能解释一下他们的目的吗(从基础开始,我还在学习目标C),以及上面两个例子的目的有什么不同吗?

你在头文件和实现文件中放什么完全取决于你。在编译之前,它们都会被预处理器连接起来。将其他编译单元可能希望使用的外部接口放入头文件是惯例。编写示例代码的人打算将
.m
文件中定义的所有属性保持为私有-也就是说,系统中的其他代码不会直接访问这些属性。

在头文件和实现文件中放置的内容完全由您决定。在编译之前,它们都会被预处理器连接起来。将其他编译单元可能希望使用的外部接口放入头文件是惯例。编写示例代码的人打算将
.m
文件中定义的所有属性保持为私有-也就是说,系统中的其他代码不会直接访问这些属性。

在.h中定义的内容可以被任何.m文件使用,只要.m包含.h。但是在.m中定义的内容只能在当前的.m文件中使用。

在.h中定义的内容可以被任何.m文件使用,只要.m包含.h。但是.m中定义的东西只能在当前的.m文件中使用。

首先请注意,
.m
是Objective-C文件(可以同时包含Objective-C和C),而
.C
是纯C文件,只能包含C代码。两者都使用头的
.h
扩展名

关于Objective-C,
.m
文件没有
@interface TileMapLayer()
来声明类扩展。类扩展可以向已在
.h
文件中声明的类添加IVAR和属性。扩展名只能从其自己的
.m
文件中查看。在
.h
文件中声明扩展名没有多大意义,但如果需要,我想您可以这样做

关于用途,建议的做法是声明
.h
中所需的最小属性量,以保持界面整洁。对于仅在类内部需要的属性,可以在
.m
文件的扩展名中声明它们。我个人的偏好是完全避免显式声明和使用IVAR(除非我重写了属性setter或getter),因为这样在实现中我可以第一眼看出哪些变量是函数或对象属性的本地变量。开销通常可以忽略不计,我更喜欢为可读性编写代码,而不是过早地进行优化。由于最近引入了自动合成属性,这也节省了大量样板代码


我还推荐的一种策略是仔细考虑哪些属性应该从对象外部修改,哪些属性不应该修改。在
.h
文件中将不可修改的属性声明为
只读
。然后,您可以在
.m
扩展中将它们重新声明为
readwrite
,用于对象本身的操作。这样可以确保您或您的同事不会犯错误并修改不应从对象外部更改的
只读
属性。从某种意义上说,它有助于你将对象的逻辑保持在它里面。我会尽量避免声明所有内容
readwrite
(默认设置)的陷阱,因为它通常会在以后攻击你。

首先注意,
.m
是Objective-C文件(可以同时包含Objective-C和C),而
.C
是纯C文件,只能包含C代码。两者都使用头的
.h
扩展名

关于Objective-C,
.m
文件没有
@interface TileMapLayer()
来声明类扩展。类扩展可以向已在
.h
文件中声明的类添加IVAR和属性。扩展名只能从其自己的
.m
文件中查看。在
.h
文件中声明扩展名没有多大意义,但如果需要,我想您可以这样做

关于用途,建议的做法是声明
.h
中所需的最小属性量,以保持界面整洁。对于仅在类内部需要的属性,可以在
.m
文件的扩展名中声明它们。我个人的偏好是完全避免显式声明和使用IVAR(除非我重写了属性setter或getter),因为这样在实现中我可以第一眼看出哪些变量是函数或对象属性的本地变量。开销通常可以忽略不计,我更喜欢为可读性编写代码,而不是过早地进行优化。由于最近引入了自动合成属性,这也节省了大量样板代码

我还推荐的一种策略是仔细考虑哪些属性应该从对象外部修改,哪些属性不应该修改。在
.h
文件中将不可修改的属性声明为
只读
。然后,您可以在
.m
扩展中将它们重新声明为
readwrite
,用于对象本身的操作。这样可以确保您或您的同事不会犯错误并修改不应从对象外部更改的
只读
属性。从某种意义上说,它有助于你将对象的逻辑保持在它里面。我会尽量避开tr