• IOS与C++一样,拥有.h头文件.m文件。在C++中一切变量函数声明都定义在.h文件中,这一点IOS与此相似却也有些不同。 IOS头文件定义变量的地方有两处:@interface的{ }里面外面。在与头文件对应的.m文件中的使用...

    楼主2年前曾做过IOS项目,当时工作繁忙没有时间记录下所学的点点滴滴,现在楼主打算重新学习,特此写下一些IOS的相关知识。

    IOS与C++一样,拥有.h头文件和.m文件。在C++中一切变量和函数声明都定义在.h文件中,这一点IOS与此相似却也有些不同。

    IOS头文件定义变量的地方有两处:@interface的{ }里面和外面。在与头文件对应的.m文件中的使用是没有什么区别的,直接使用即可,主要区别在于外部调用。

    写在@interface的{ }里面的变量只能在本类和子类(派生类)中使用,相当于C++中的保护型(protect)。

    而写在@interface的{ }外面的变量可以在任何类中使用,相当于C++中的公有型(public)。

    方法的定义就相对简单,带有“-”号的方法只能在本类和子类(派生类)中使用,相当于C++中的保护型(protect)。

    带有“+”号的方法可以在任何类中使用,相当于C++中的公有型(public)

    但是,IOS对于开发者使用公有型(public)变量和方法做了十分谨慎的限定,公有型的变量有@property属性进行引用计数和内存限制(这个以后再讲)。而带有“+”号的公有型方法还有static的属性,可以直接使用类名进行调用。


    C++中的私有型(private)与保护型和公有型的变量(方法)区别在于无法被外部调用,因此IOS做了个巧妙的方法加以区别,将私有型变量(方法)放入.m文件中定义。

    在.m文件的开始处有一个@interface定义,写在{ }里面的变量就是本类的私有型(private)变量。在{ }外面是不能再定义变量只能定义方法,这里定义的方法也是私有型的。

    理论讲解到这里结束,下面我们来测试一下。


    博主定义了一个Test1类继承于Test类,因此在Test的.h头文件中定义的变量a,b,c和方法add()、add1()都可以调用,而在.m定义的变量d和方法add2()却无法调用。


    在testFather方法中无论使用什么方法都无法调用到变量d和方法add2,提示无法找到变量d和方法add2。


    至此结束,欢迎大家指正,交流学习。


    展开全文
  • 属性在.h文件中和在.m中声明是有区别的。...属性”来调用,但在.m中声明的则不可以,获取设置的方法,只能是通过setValue:forKeyvalueForKey来实现。 成员变量,有三种权限,就是大家



    转载地址: http://my.oschina.net/u/574245/blog/336780  


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


    成员变量,有三种权限,就是大家都知道的@private、@protected、@public ,写在.m文件中时,相当于是@private权限,子类无法访问,验证了一下,做权限修改也无效。而写在.h文件中,默认是@protected权限,子类可以访问,可以做权限修改。因为访问权限指针对.h文件。.h文件中成员变量,外部类对其的调用,跟C++一样,用->来调用。




    展开全文
  • .h :头文件。头文件包含类,类型,函数常数的声明。  .m :源代码文件。这是典型的源代码文件扩展名,可以包含Objective-CC代码。  .mm :源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C...

    因为直接是从java转OC的,所以对这些刚开始不是很理解,所以记录下来

    文件区别:

    .h :头文件。头文件包含类,类型,函数和常数的声明。 
    .m :源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。 
    .mm :源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名

    .cpp:只能编译C++ 

    当你需要在源代码中包含头文件的时候,你可以使用标准的#include编译选项,但是Objective-C提供了更好的方法。#import选项和#include选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C的例子和文档都倾向于使用#import。

    .m 和.mm 的区别是告诉gcc 在编译时要加的一些参数。当然.mm还可以命名成.m,但在编译时要手动加参数(麻烦)

    常用场景:

    如果你的OC代码里面有包含C++的引用或代码,将此类更改为.mm即可;

    例子:

    ERROR:./zxing/cpp/core/src/zxing/common/Counted.h:21:10: 'iostream' file not found

     在引用zxing的时候#import<QRCodeReader.h>用到了iostream,但是它是/iphoneOS6.1/user/include/c++下面的类,故需要把类名改为.mm即可

    注意#import或#include的位置要在.mm文件里,如果在.h头文件里是没用的

    展开全文
  • iOS - 关于header.h和pch

    2016-10-09 14:06:03
    header.h1....#import "MBProgressHUD.h" #import "AFNetworking.h" #import "UIImageView+AFNetworking.h" #import "SBJSON.h" #import "MJRefresh.h" #import "ASProgressPopUpView.h" #import

    header.h

    1.引入普遍使用文件

    /* 第三方头文件 */
    #import "MBProgressHUD.h"
    #import "AFNetworking.h"
    #import "UIImageView+AFNetworking.h"
    #import "SBJSON.h"
    #import "MJRefresh.h"
    #import "ASProgressPopUpView.h"
    #import "YYCycleScrollView.h"
    
    /* 网络数据 */
    #import "NTHttpRequest.h"
    #import "NTNetUtil.h"
    #import "LCDownloadManager.h"
    
    /* 工具 */
    #import "RMMapper.h"
    #import "Utils.h"
    #import "UIViewExt.h"
    #import "AppData.h"

    2.宏定义

    屏幕尺寸
    系统版本
    颜色
    文件路径

    //距离
    #define ScreenWidth [UIScreen mainScreen].bounds.size.width
    #define ScreenHeight [UIScreen mainScreen].bounds.size.height
    #define iPhone5sHight 568
    #define iPhone5sWigtht 320
    #define iPhone6sHight 667
    
    //屏幕尺寸相关
    #define KSCREENWIDTH  ([UIScreen mainScreen].bounds.size.width)
    #define KSCREENHEIGHT ([UIScreen mainScreen].bounds.size.height)
    #define KRATE (KSCREENWIDTH/320.0)
    
    //颜色
    #define SetColor(r,g,b,a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]
    #define NavBackColor [Utils colorWithHexString:@"#07c8cf"]
    #define BackColor SetColor(247, 247, 247, 1)
    #define LineColor [Utils colorWithHexString:@"#ececec"]
    
    //文件路径
    #define recourcesPath [[NSBundle mainBundle] resourcePath]

    pch - Precompile Prefix Header

    Xcode 6去掉Precompile Prefix Header的主要原因在于:

    (1)去掉自动导入的系统框架类库的头文件,可以提高原文件的复用性,便于迁移。
    (2)一个肥胖无比的Prefix Header会大大增加Build Time。

    为了取代在Prefix Header中自动导入的框架,可以在每一个需要导入系统框架的文件中通过@import来手动导入,当然要确保Build Settings中的Enable Modules是打开的。

    如果在Prefix Header中导入了,那么我们在工程的每一个文件中可以免费获得使用的权利,而无需手动在每一个.h/.m文件中导入。该文件确有其方便之处。

    如果一定要用到Precompile Prefix Header,可以参考Xcode 5的配置来手动设置。

    (1)在工程中增加一个pch文件,命名还是按照Xcode 5的模板比较好:工程名-Prefix.pch,例如a-Prefx.pch
    (2)设置Build Settings
    其中Prefix Header指定pch文件的位置。
    这里写图片描述

    注意:开关Precompile Prefix Header时,pch的编译和导入机制是有很大不同的。
    如果Precompile Prefix Header为YES,那么pch会被预编译,预编译后的pch文件会被缓存起来,从而提高编译速度。可以从下面的Build Log中看出:
    这里写图片描述

    如果Precompile Prefix Header为NO,那么pch不会被预编译,而是在每一个用到它导入的框架类库的.m文件中编译一次。例如a-Prefix.pch导入了,ViewController.m和AppDelegate.m中都使用了objc_property_t这个类型(注意ViewController.h/m和AppDelegate.h/m都没有另外导入),那么在Build的过程中,在编译ViewController.m和AppDelegate.m时,a-Prefix.pch会被编译2次,每个.m文件编译一次。如下图:
    这里写图片描述
    由图可知,如果Precompile Prefix Header为NO,那么每个引用了pch内容的.m文件都要编译一次pch,可能Apple会另外做缓存机制,但是这样还是降低了编译的速度。
    既然Apple标准都建议我们不用pch了,那么还是尽量少用吧。当然,如果一定要用,还是尽量减少pch文件中的内容,降低工程对pch文件的依赖性,便于日后的迁移和解耦。

    展开全文
  • Xcode中自定义每个.h和.m中上部默认显示的信息(公司,版本,作者,版权声明等)每个iOS开发者新建class文件的时候都可以看到文件最上面声明的一些基本信息。而这些信息都是默认的,我们现在就要来自定义这些信息。...

    Xcode中自定义每个.h和.m中上部默认显示的信息(公司,版本,作者,版权声明等)

    每个iOS开发者新建class文件的时候都可以看到文件最上面声明的一些基本信息。而这些信息都是默认的,我们现在就要来自定义这些信息。添加一些自己想要添加的,比如Github链接等等。

    1.下面为默认的信息

    //
    //  VideoCell.m
    //  WMVideoPlayer
    //
    //  Created by zhengwenming on 16/1/17.
    //  Copyright © 2016年 author. All rights reserved.
    //
    

    2.我们想要这样显示

    /*!
    
    @header TableViewCell.m
    
    @abstract 
     作者Github址:https://github.com/zhengwenming
    
    作者CSDN博客地址:http://blog.csdn.net/wenmingzheng
    
    @author   Created by zhengwenming on  16/1/17
    
    @version 1.00 16/1/17 Creation(版本信息)
    
           Copyright © 2016年 郑文明. All rights reserved.
     */
    

    第一步、Finder -> 应用程序-> Xcode ->右键显示包内容

    然后可以看到一个content文件夹,我们要找到这个路径下的一个File Templates(文件模版)。路径为Contents -> Developer -> Platforms -> iPhoneOS.platform -> Developer -> Library -> Xcode -> Templates -> File Templates
    File Templates下面有四个文件夹

    大家看到File Templates文件夹下面有五个文件夹,我们需要修改的是Source文件夹下面的Cocoa Touch Class.xctemplate对应的所有文件的.h和.m,如果只修改一个,那么新建文件的时候,必须继承这个类才会看到自定义的文件注释,所以我本人是把所有的都改了,包括swift的文件。要修改的文件

    第二步,选择.h和.m进行自定义修改。

    我们那一个NSObjectObjective-C类做例子。选中NSObjectObjective-C,看到NSObjectObjective-C文件下的.h和.m,双击.h文件。我们看到的是默认的设置,系统用双斜杠//注释文件的。那么我们要全部删了,然后加入类似这样的自定义代码(我用了/! /).

    /*!
    
    @header TableViewCell.m
    
    @abstract 
     作者Github址:https://github.com/zhengwenming
    
    作者CSDN博客地址:http://blog.csdn.net/wenmingzheng
    
    @author   Created by zhengwenming on  16/1/17
    
    @version 1.00 16/1/17 Creation(版本信息)
    
           Copyright © 2016年 郑文明. All rights reserved.
     */
    

    那么最终我们编辑为这样的,有图有真相。
    最终样子

    OK,一个文件已经完成。那么你还要编辑.m文件,copy之后打开.m文件直接粘贴上去就可以了。下面还有很多系统的类,比如UIView对应的,UIViewController对应的,都要修改。在此不再重复,步骤就是复制粘贴。

    第三步、重启Xcode,新建一个类

    小伙伴们来看看效果:新建一个TableViewCell类
    这里写图片描述

    注意⚠️:我们修改完全部的类之后,要重启Xcode,然后新建一个类,这样就可以看到你的设置了。哈哈!快去试试吧。

    最后欢迎大家关注文明的iOS开发公众号:
    方式1、搜索:“iOS开发by文明”
    方式2、扫描下方二维码
    这里写图片描述

    另外博主维护一个iOS开发技术支持群:479259423,进群必须改名,群名片格式:城市-iOS-名字,例如广州-iOS-文明。

    展开全文
  • IOS的.m和.mm文件总结

    2019-01-11 11:47:40
    1. .m文件是纯Object-C 文件 .mm是Object-CC++混合文件   2. .m只能调用纯Object-C的类,不能调用混合的 .mm可以调用Object-C的,也可以调用C++的   3. .m要调用混合的怎么办? 可以 解决办法是.h用...
  • 1. 为什么.h文件.m文件里各有1个`@interface`?它们分别有什么用? 2. .h中,value1为什么要定义2遍? 3. `@synthesize`有什么用? 。。。
  • 区别IOS5之前在iOS第一版中,我们为输出口同时声明了属性底层实例变量,那时,属性是OC语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如:@interface MyViewController :UIViewController ...
  • h .m 文件中自动创建两个几乎完全一样的@interface。  比如: 创建一个UIViewController 的实例: 在 .h 文件中: #import @interface MainController : UIViewController @end 在 .m 文件中: #import ...
  • 现在在看别人的代码 发现他们都把h文件的内容写到m文件里 比如: ``` @interface MyTreeViewController () { NSArray *tree; } @end @implementation MyTreeViewController - (id)initWithNibName:(NSString *...
  • ios 生成.a文件

    2018-10-12 17:27:04
    现在再有一个功能,不知道是集成方是想用.a 还是framework 就将两种都给实现了 ,这篇介绍.a文件的生产, framework生产 生产.a库 ...2 之后我们会看到自动生成.h和.m文件 可以在.m文件中写你要的...
  • 在我们研究一些程序的代码时,总是能在某个.h文件中发现有许多@interface分别定义了不同的类。比如AFNetworking的AFURLRequestSerialization.h中我们可以看到: @interface AFHTTPRequestSerializer : NSObject <...
  • iOS中的.a文件

    2017-06-01 16:54:08
    静态库可以将 .m文件封装成一个.a文件,第三方应用程序只需要拿到这个.a文件代码对应的.h文件即可使用静态库中封装的方法。IOS静态库适合去制作第三方提供的SDK。 .a文件与 iOS静态库 首先看静态库动态...
  • 解决方法: 把UITableView+SDAutoTableViewCellHeight.m UIView+SDAutoLayout.m都改成.mm后缀文件,开启混编模式。
  • iOS库 .a与.framework区别

    2017-10-31 18:03:45
    库是共享程序代码的方式,一般分为静态库动态库。 二、静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。 动态库:链接时不复制,程序运行时由系统动态加载到内存...
  • iOS ProtocolBuffer 最新操作记录,以及'GPBProtocolBuffers_RuntimeSupport.h' file not found'等问题处理
  • × 出现这个问题会特别蛋疼,明明存在该文件,但是一直报错。这里总结一下,希望对各位开发有用。 解决方法: ...确认是否存在改文件,文件是否在拖进项目时是否勾选上Copy items if needed ...
  • iOS 打包静态库.a文件

    2015-10-28 09:14:21
    3、将需要暴露的.h文件暴露出来,.m会自动编译到.a文件中 4、分别选择真机设备模拟器,command + B编译,staticTest会从红色变成黑色。真机模拟器环境下用的.a文件是分开的。 5、在“Show in Finder ”,可以...
1 2 3 4 5 ... 20
收藏数 118,721
精华内容 47,488