2016-07-19 14:00:00 lxubin 阅读数 3847

玩过ios开发的都知道,在XCode 中创建一个新的类文件,会在 . h 和 .m 文件中自动创建两个几乎完全一样的@interface。 

比如: 创建一个UIViewController 的实例MainController:


在 .h 文件中:

#import <UIKit/UIKit.h>

@interface MainController : UIViewController

@end

在 .m 文件中:

#import "UIViewController.h"

@interface MainController ()

@end

乍一看,两个@interface几乎一样。 

你可以在 .h 文件中,声明 属性 和 成员变量; 也可以在.m文件中声明这些属性 和 成员变量。 更为有意思的是,你甚至可以在storyboard 中,通过拖拽方式,将一个IBOutlet 拖拽到 .h 或 .m 文件中。

尽管可以随意操作,但从本质上讲,还是存在较大差异的。 

属性:

属性的区别就是,在.h文件中声明的属性,外部类可以通过“类实例.属性”来调用,但在.m中声明的则不可以,获取和设置的方法,只能是通过setValue:forKey和valueForKey来实现。

成员变量:
成员变量,有三种权限,就是大家都知道的@private、@protected、@public ,写在.m文件中时,相当于是@private权限,子类无法访问,验证了一下,做权限修改也无效。而写在.h文件中,默认是@protected权限,子类可以访问,可以做权限修改。



再进一步想想,也容易理解。

因为 .h 文件可以被其他.m 文件 #import。 自然就可以被其他.m文件访问; 而在.m 文件中所声明的,其实就是一个 static的 变量或方法,自然不能被其他文件访问。


小结:
在.h文件中声明的属性,外部类可以调用,但在.m中声明的外部类则不可以调用。

在.m文件中声明的成员变量,只有本类可以访问,在.h文件中声明的成员变量,本类和子类可以访问。


2017-09-29 13:35:32 s31213 阅读数 335
创建C++类生成的头文件后缀变成了.hpp
并非.h文件
这两个文件都是可以被正常编译的
只是从命名上可以看出有一定的不同,.
h一般都只是声明,而.hpp文件说明内容中既有函数声明也有函数的定义,
就如同大部分开发者都把inline函数定义到.inl文件中一样。
由于已经养成了长期的使用习惯,
每次都要手动去改文件的扩展名和文件头的注释信息。


只需要找到xcode生成C++文件的模板位置,
/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates/File\
Templates/Source/C++\ File.xctemplate/WithHeader
将 ___FILEBASENAME___.hpp文件重命名为 ___FILEBASENAME___.h,然后将 ___FILEBASENAME___.hpp与 ___FILEBASENAME___.cpp文件内容中对应的
.hpp也修改成.h
2014-09-20 14:32:17 snow_moon_night 阅读数 1052

iOS:如何理解.h 和 .m 文件中的同一个@interface  

在XCode 中创建一个新的文件,会在 . h 和 .m 文件中自动创建两个几乎完全一样的@interface。  比如: 创建一个UIViewController  的实例:

在 .h 文件中:  

#import <UIKit/UIKit.h>

@interface UUTaskDetailController : UIViewController

@end

在 .m 文件中:

#import "UUTaskDetailController.h"

@interface UUTaskDetailController ()

@end

乍一看,除了高亮的部分外,其他的都一样。 你可以在 .h 文件中,声明 @property 和 method;  也可以在.m文件中声明这些@property 和 method。  更为有意思的是,你甚至可以在storyboard 中,通过拖拽方式,将一个IBOutlet 拖拽到 .h 或 .m 文件中。

尽管可以随意操作,单从本质上讲,还是存在较大差异的。 接下来,让我们看看它们背后的故事。

如有你有public 和 private 的概念, 你可以理解为:  .h 文件声明的@property ,是公共的,是可以被其他的.m 文件访问的; 而 在.m文件中声明的@property,是私有的, 只能在该.m文件中使用。 

再进一步想想,也容易理解。 

因为 .h 文件可以被其他.m 文件 #import。 自然就可以被其他.m文件访问; 而在.m 文件中所声明的,其实就是一个 static的 变量或方法,自然不能被其他文件访问。 

小结:

弄清楚了 .h  与 .m 文件的差别后,你完全可以根据自己的意愿,随心所欲地使用。  你声明的 property ,如果不想被其他文件调用, 那就声明在 . m 文件好了; 如果想让其他文件调用呢, 当然要声明在 .h 文件中。

2014-10-28 22:26:00 iteye_19926 阅读数 47

上一篇文章iOS开发:第一个iOS程序分析——代理,生命周期函数中主要介绍了iOS使用Objective-C开发的两个主要文件main.m和AppDelegate.m和控制程序生命周期的函数,接下来将介绍另外两个文件:AppDelegate.h文件、UIViewController.m文件和iOS开发中的View和ViewController。

打开AppDelegate.h文件:

先看一下AppDelegate类,前面说过,AppDelegate是作为Application的代理,这个程序中的AppDelegate不仅负责控制程序的生命周期,而且负责控制程序初始界面(初始StoryBoard)的显示,因此该代理类必须能够访问到初始界面的界面元素。

明白这点,就不难了解KZX AppDelegate类中为什么会有UIWindow的一个引用了。如下

该文件只有以下寥寥几行代码:

<span style="font-family:Comic Sans MS;font-size:14px;">#import <UIKit/UIKit.h>

@interface KZXAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end
</span>

除去导入头文件的语句,文件由@interface开始声明到@end结束声明,可以看到,确实该代理类持有一个UIWindow类的实例,该UIWindow实例即代表了该视图控制器所负责控制显示的窗口视图(即一个屏幕界面),读者朋友可以尝试把这一句删去,会发现运行程序后是黑漆漆一片,因为代理无法找到应该在哪里显示视图。自然没有界面。

那么为什么代理要持有UIWindow的实例而不持有其他视图的实例呢?

先来看看官方文档对于视图的说明(View):

“Views not only display themselves onscreen and react to user input, they also serve as containers for other views. As a result, views in an app are arranged in a hierarchical structure called the view hierarchy. The view hierarchy defines the layout of views relative to other views. Within that hierarchy, view instances enclosed within a view are called subviews, and the parent view that encloses a view is referred to as its superview. Even though a view instance can have multiple subviews, it can have only one superview.At the top of the view hierarchy is the window object.

"视图不仅在屏幕上显示他们本身、对用户的输入做出反应,而且也能够作为容器来为其他视图提供服务。所以一个app中的视图是被组织成一种层次结构的,叫做视图层级。视图层级决定了不同但是相关的视图之间的布局和排版。在视图层级里面,多个视图围绕某个特定的视图来布局,则该特定的视图称为父视图,而围绕父视图布局的其他视图称为子视图。尽管一个视图能够拥有多个子视图但是一个视图不可能有多个父视图。在视图层级的最高层次是window对象"。

注意最重要的是最后一句话,也就是说如果把视图层级看成一棵树的话,那么这棵树的根就是window对象,因此学过树数据结构的都知道,持有根节点当然能方便地访问其他所有节点,这就是AppDelegate持有UIWindow的原因。


注意到@interface AppDelegate后还带了: UIResponder <UIApplicationDelegate>,在Objective-C中,继承写法跟C++一样都是用冒号(半角)来表示,所以这一句表示了该代理类继承了UIResponder类,但是后半部分<UIApplicationDelegate>则体现了Objective-C还有的 协议 这种概念,协议类似于Java中的接口,与接口不同的是实现协议可以不实现协议的所有方法,具体要看协议声明方法时是用@optional还是@required。可在Xcode中command+点击UIApplicationDelegate看看,如下。

<span style="font-family:Comic Sans MS;font-size:14px;">@protocol UIApplicationDelegate<NSObject>

@optional

- (void)applicationDidFinishLaunching:(UIApplication *)application;
- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions NS_AVAILABLE_IOS(6_0);
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);

- (void)applicationDidBecomeActive:(UIApplication *)application;
- (void)applicationWillResignActive:(UIApplication *)application;
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;  // Will be deprecated at some point, please replace with application:openURL:sourceApplication:annotation:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation NS_AVAILABLE_IOS(4_2); // no equiv. notification. return NO if the application can't open for some reason

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;      // try to clean up as much memory as possible. next step is to terminate app
- (void)applicationWillTerminate:(UIApplication *)application;
- (void)applicationSignificantTimeChange:(UIApplication *)application;        // midnight, carrier time update, daylight savings time change

- (void)application:(UIApplication *)application willChangeStatusBarOrientation:(UIInterfaceOrientation)newStatusBarOrientation duration:(NSTimeInterval)duration;
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation;

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame;   // in screen coordinates
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame;
</span>


...省略若干行


接下来就是KZXViewController.m(KZXViewController.h几乎没有内容):

先来看看Apple对视图控制器的一些官方文档(ViewController):

“In an iOS app, you use a view controller (UIViewController) to

manage a content view with its hierarchy of subviews.A view

controller isn’t part of the view hierarchy and it’s not an element

in your interface. Instead, it manages the view objects in the hierarchy

and provides them with behavior.
You also use view controllers to implement transitions from one type of

content to another. Because iOS apps have a limited amount of space in

which to display content, view controllers provide the infrastructure

needed to remove the views of one view controller and replace them

with the views of another.”


在一个iOS 的 app 中,你使用一个视图控制器(UIViewController)来

管理一个具有内容的视图以及他的子视图层级。注意视图控制器并不是视

图层级的一部分,而且也不属于用户界面的元素。实际上,他是用来管理

视图层级中的视图对象的,并且为他们定义一些响应行为(来作为与用户

的交互)。当然也可以使用视图控制器来作为两个(种)具有内容的视图

的过渡,毕竟iOS app(实际上应该是iOS的大部分设备屏幕)只有有限的

空间来显示内容,视图控制器提供了删除视图和替换视图的一些必须的基础函数。“


由以上可知,一个视图的视图控制器实际负责两部分——管理该视图的

子视图层级,管理该视图与其他视图的转换。

回到KZXViewController.m文件,该文件中定义了如下函数:

<span style="font-family:Comic Sans MS;font-size:14px;">- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

- (void)viewDidLoad

- (void)didReceiveMemoryWarning

</span>

initWithNibName使用一个xib文件名(视图布局文件)来初始化视图

的子视图层级,viewDidLoad在初始化完毕后调用(两个函数对应“管理

子视图层级”功能),而didReceiveMemoryWarning通常在内存不足时

被警告时调用,此函数一般用来释放一些资源和数据。

关于体现视图控制器“管理该视图与其他视图转换”的功能,

读者朋友可以打开UIViewController头文件看声明的方法对应。


总结:

1.代理通过适时调用委托方的函数来控制对委托方的访问,ApplicationDelegate

作为整个app的代理不仅要控制app的生命周期,还要负责app入口界面,因此

ApplicationDelegate持有app入口界面的视图层级根视图——UIWindow。

2.视图控制器负责管理该视图的子视图层级以及管理该视图与其他视图的转换。

视图控制器不属于视图,不在视图层级之内。


下一次我们将介绍MainStoryBoard.storyboard文件以及常用的一些视图控件的使用。


2018-07-20 11:54:00 weixin_34348174 阅读数 152

没接触过ios的原生开发,对这个有点不解。
下面来了解下:
新建一个类 这个类继承 NSObject的类,就会创建出这样两个文件


img_a52f8bfb6b727c1b2d21fc327b177bff.png
image.png

img_8fa4a53bc631e50d3f51cc490b647454.png
image.png
img_faa30a455646fa54d3e09c8d83bb57af.png
image.png
img_67945d09679cf383cc46e4dda805df94.png
image.png
在.h文件中

          有一个import,这是用来导入工具包,就是foundation框架

          @这个标志表示你使用的是object-c语言

         @interface 是声明类的关键字 

         tongdun是类名

         : 冒号表示继承,oc中是单继承模式

         NSObject是父类

         在@interface和@end之间是用来声明属性和方法的

在.m文件中声明的属性是无法被外界看到的,所以也成为私有属性,而在.h中的属性就是public属性

 

在.m文件中

  #import ”tongdun.h“ 用来导入.h中声明的属性和变量

  @implementation tongdun   implementation是实现类的关键字

学会建类之后,接下来就可以 学习下 如何写ios和RN的交互类。

iOS-.h和.m文件

阅读数 1

ios 生成.a文件

阅读数 1957

没有更多推荐了,返回首页