• ios-@import和#import

    2018-04-11 14:22:12
    在Xcode5以后,我们就可以不用再去在如下图所示的的Linked Frameworks and Libraries中去显式的添加frameword了Xcode5以后有个新东西modules、AutoLinking和@import,原本我们之前导入头文件都是使用#import,这个...

    在Xcode5以后,我们就可以不用再去在如下图所示的的Linked Frameworks and Libraries中去显式的添加frameword了


    Xcode5以后有三个新东西modules、AutoLinking和@import,原本我们之前导入头文件都是使用#import,这个就是和include的作用差不多就是相当于把头文件的内容复制过来,然后把本身的#import的头文件那句话给替换掉。但是#import比#include进步的一点就是能减少重复引用了,比如说你在A.h文件中#import C.h,B.h中也#import C.h,然后你在D.h文件中#import A.h #import B.h,是不会有关于C.h文件重复引用的问题的。具体的方法是通过#ifndef也就是条件编译来实现。

    在苹果没有推出Modules的时候,我们如果写的程序比较复杂的话,我们#import了很多相同的头文件,这样会很麻烦,而且编译速度慢,所以苹果有一个pch文件可以帮助我们解决,但是放在pch的头文件,虽然提高编译速度,在整个工程中都能访问,这样终归不好。pch文件其实就是采用了预编译处理,当在Build Setting中的Precompile Prefix Header为YES,把一些公用的头文件放入预编译头文件中预先进行编译,然后在真正编译工程时再将预先编译好的产物加入到所有还没编译的文件中去,以此来加快编译速度。

    一个完整的编译过程如下所示

    1.预处理(Pre-process):把宏替换,删除注释,展开头文件,产生 .i 文件
    2.编译(Compliling):把之前的 .i 文件转换成汇编语言,产生 .s文件
    3.汇编(Asembly):把汇编语言文件转换为机器码文件,产生 .o 文件
    4.链接(Link):对.o文件中的对于其他的库的引用的地方进行引用,生成最后的可执行文件(同时也包括多个 .o 文件进行 link)

    所以苹果推出了Modules,Modules相当于将框架进行了封装,然后加入在实际编译之时加入了一个用来存放已编译添加过的Modules列表。如果在编译的文件中引用到某个Modules的话,将首先在这个列表内查找,找到的话说明已经被加载过则直接使用已有的,如果没有找到,则把引用的头文件编译后加入到这个表中。这样被引用到的Modules只会被编译一次,而且在开发的时候也不存在整个工程都能去访问了。又可以提高编译速度。

    在Xcode5之后,是默认开启了modules的,我们如果使用#import,Xcode会帮我们自动映射成@import,所以我们可以不用手动的去导入框架了。自动做的配置如下图所示

    这其中其实就是@import通过AutoLinking,Xcode的编译器LLVM会在编译阶段将所涉及到的框架自动帮你写到link里,不需要在build phases里手动添加了。



    展开全文
  • #import "" 表示引用本地文件// 自己创建 #import
    #import "" 表示引用本地文件// 自己创建
    #import <> 表示引用库文件 // 系统文件
    
    展开全文
  • 1.点击项目名后进入Build setting 选项,在搜索框内输入 user header 进行搜索; 2.选中 User Header Search Paths ,双击后点击弹出... 3.在输入框填入 ${SRCROOT} 4.将输入框右的选择项选成 recursive 5.问题解决.

    1.点击项目名后进入Build setting 选项,在搜索框内输入 user header 进行搜索;

    2.选中 User Header Search Paths ,双击后点击弹出框左下角的"+"号进行添加;

    3.在输入框填入 ${SRCROOT}

    4.将输入框右方的选择项选成 recursive

    5.问题解决.


    展开全文
  • 1. #include #include是C/C++中引用文件的预处理指令。 #include的作用就是把引用的文件中所有内容将#include给替换,就像你把引用的文件中所有内容拷贝覆盖到#include那一行。 2. #import ...#import...

    1. #include

    #include是C/C++中引用文件的预处理指令。

    #include的作用就是把引用的文件中所有内容将#include给替换,就像你把引用的文件中所有内容拷贝覆盖到#include那一行。

    2. #import

    //导入系统头文件使用 < >
    #import <UIKit/UIKit.h>
    //导入自定义头文件使用 " "
    #import "ViewController.h"
    

    #import是objective-C中引用文件的预处理指令。

    #import的作用大致和#include相同,但#import相较于#include而言,#import可以防止文件“重复导入”。

    什么是重复导入

    A.h中导入了D.h,B.h也导入了D.h,当C.h既导入A.h又导入B.h的时候,C.h中就会重复导入D.h。

    而#import确定一个文件中只能导入另一个文件一次,因此#import可以防止文件重复导入。
     

    3. @class

    //声明一个类
    @class ViewController;
    //一次声明多个类
    @class ViewController, MyView, MYBookModel;

    @class关键字只是告诉编译器这是一个类的名称,至于这个类是如何定义和实现的,它并不关心。

    也就是说@class并不会像#import那样导入该类的文件内容,所以使用@class可以提升编译性能。

    一般在.h中只需要知道被引用类的名称就可以了,不需要被引用类的定义和实现,所以在.h中通常使用@class导入类即可。

    而且在.h中使用@class代替#import,可以避免在.h中使用#import可能会导致的一种编译错误“循环依赖”。

    什么是循环依赖

    A.h中导入了B.h,同时在A.h中定义如下属性:

    @property(nonatomic, strong) B *b;

    而B.h又导入了A.h,此时就会形成循环依赖,出现编译错误

    但如果A.h中仅仅只是导入了B.h,并没有定义上面的那条属性,B.h也仅仅只是导入了A.h,那么这样只是形成“循环导入”并不会出现编译错误,A.h要使用B.h(或B.h使用A.h)形成“依赖”才会出现编译错误。

    4. @import

    @import用于引用苹果自己的框架。

    @import的具体特性在这就不介绍了,Xcode默认开启该特性,因此编译器在编译时会自动把引用系统框架的#import映射为@import。

    区别在于:@import只能引用苹果自己的框架,而#import还可以引用第三方框架和自定义文件。

    在实际项目中我们导入大多数文件是第三方框架和自定义文件,所以为了保持代码一致性,所以会全部使用#import而不会使用@import。

    @import UIKit;        等价于==> #import <UIKit/UIKit.h>
    
    @import UIKit.UIView; 等价于==> #import <UIKit/UIView.h>
    
    

    5. 总结

    能只在.m中使用#import,就尽量不在.h中使用#import。

    如果.h必须导入文件,尽量使用@class代替#import。

    尽量使用#import而不使用@import。

    展开全文
  • 原始地址:XMPPFrameWork IOS 开发(二) 译文地址: Getting started using XMPPFramework on iOS 介绍 ios上的XMPPFramework你能够在Xcode/iPhoneXMPP 目录找到,它只是实现了XMPP的一小部分功能。 下面...

    标签:

    一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失。

    xmpp中最常用的框架就是 xmppFrameWork

    本文也会处理常见的@import libxmlSimu; Module 'libxmlSimu' not found 的错误 和 #import <libxml/tree.h> not found错误

    环境安装有一篇很好的文章,我就不写了:

    xmpp整理笔记:环境的快速配置(附安装包)  http://www.cnblogs.com/dsxniubility/p/4304570.html

    第一种方法直接拖

    1> 拖入文件夹

     也可以直接去github下载。

    这里有个特别严重的问题,就是最新版本的XMPPFramework 在下边的配置完毕后编译会报关于

     @import libxmlSimu; Module 'libxmlSimu' not found 的错误

    这里的解决办法我搜遍全网都没有找到,会想以前做项目的时候使用没有遇到这个问题,果断换了个老一点的版本,果然没有报错。。。

    提供一个老版本下载的地方,点击前往,(功能上没有什么缺失,够用了)

    2>  拖入Sample_XMPPFramework.h,重命名为XMPPFramework.h

    技术分享

     

    3>  添加框架

        CFNetwork.framework

        Security.framework

        libxml2.dylib

        libresolv.dylib

      libin.a

    技术分享

     

    4>  修改Build Settings

        Header Search Paths

            添加 "/usr/include/libxml2"

        Other Linker Flags

            添加 "-lxml2"

        Library Search Paths (这一步,先不要改,运行一下看看是否有错误,如果没有就不用改了)

            将"$(PROJECT_DIR)/01-仿QQ/Lib/XMPP/Vendor/libidn"

            修改为"$(PROJECT_DIR)",并改为"recursive"

     技术分享

     

    5>  修改XMPP/Core/XMPP.h

        在文件顶部添加"#import <UIKit/UIKit.h>"

    技术分享

     

    第二种方法cocoapods

    就是使用cocoapods 可以一次性导入,并且也不需要上述的配置和调整。并且以后更新框架的时候一个pod update完事。

    但是有一个很严重的问题。就是你在导入框架pod install的时候会报错,出现一个 circular dependency 就是循环依赖。这是cocoapods的版本问题,cocoapods0.35版本会对xmppFramework框架造成循环依赖,解决的方法就是,将cocoapods的版本降到 0.34.4

    终端操作指令如下:

    1.卸载cocoapods 

    sudo gem uninstall cocoapods

    2.安装xcodeproj

    sudo gem install xcodeproj

    3.安装指定版本0.34.4的cocoapods

    sudo gem install cocoapods -v 0.34.4

     

    但是这样很不爽啊,因为往后swift什么的编程全都需要cocoapods的版本保持最新0.35 甚至0.36. 所以这个降版本非常蛋疼,两种方法都能用。具体使用哪种,可根据自己喜好决定。反正我是选了第一种。

     

    框架内的大致介绍

    Authentication    授权,身份验证

    Categories        分类

    Core              核心

    Extensions        扩展

    Utilities         工具

    Vendor            第三方库

     

      Extensions

    CoreDataStorage   coreData存储

    Reconnect    重新连接

    Roster    好友管理

        有数据表 XMPPRoster 用来管理用户

        管理用户的类 XMPPUserCoreDataStorageObject

    SystemInputActivityMonitor     系统输入的活动监控

    常用的模块

    XEP - 0009    RPC(类似黑客技术)

    XEP - 0012    最后的活动(判断上线,离开断开)

    XEP - 0045    多人聊天

    XEP - 0054    名片-个人信息设置

    XEP - 0065    sockets5字节流

    XEP - 0066    二进制数据传输(特殊信息的发送)

    XEP - 0085    聊天状态通知

    XEP - 0136    聊天记录归档

      其中有数据表 XMPPMessageArchiving

      取出当前信息的类 XMPPMessageArchiving_Message_CoreDataObject 

    XEP - 0153    基于名片的头像

    XEP - 0199    xmpp ping (用来ping服务器和ping自己)

    XEP - 0335    json容器(可能以后某些信息传输将用json格式)

     

    在core中

    XMPPElement 是一个基类 ,延展出三个子类

    XMPPIQ    请求 (用户登录,用户注册,添加好友等)

    XMPPMessage    消息(用来发各种消息等)

    XMPPPresence    展现(用户上线下线提示等)

    XMPPStream    流,非常常用,大部分类的加载都在写在流的懒加载里

    在vender中

    kissXML 用于xml的主要解析框架

    展开全文
  • 我认为是工程中在import时检测不到第三方类库的原因,从而import不会自动补全。在网上搜了很多,终于在stackoverflow找到了解决方法:只要把pods目录添加到用户头文件检索的路径即可。具体实现如下: 1.选择target...
  • 输入 ${SRCROOT} 并且选择recursive
  • 关于Objective-C,Modules和Autolinking OC自从Apple接手后,一直在...iOS4时代的GCD,iOS5时代的ARC,iOS6时代的各种简化,每年我们都能看到OC在成为一种先进语言上的努力。基于SmallTalk和runtime,本身是C的超集
  • 模糊效果,使用FXBlurView这个第三方库可以很轻松的实现这一功能。 效果: 下面来看一下实现,ViewController.m #import "ViewController.h" #import "FXBlurView.h" @interface ViewController () @end @...
  • 一,#import引号和尖括号的区别 1,#include命令 #include是C/C++的预处理指令(Preprocessor Directive),主要作用是把头文件引入到任意源文件中,在预处理阶段,被包含的文件在源文件的指令地点进行整体替换 2...
  • 使用cocoapods引入AFNetworking等后,在工程中import时找不到对应的头部 在项目的Target选择Build Settings,然后找到Search Paths,再找到User Header Search Paths 然后双击添加${SRCROOT},并后边选择...
  • 把常用的定义或者 import 放在 pch 中,这样在不用在项目中再引用和定义了,即可以做到全局 macro,又可以作为全局 import 用。然而在使用一些用C 和 C++ 编译的类库时,都无法编译通过,出现类似很多类名 not found...
  • 上一篇讲的是静态库.framework 依赖第三方库,是通过Cocoapod 提供的第三方库。而有时我们会依赖第三方.a 或者.framework 的。那么怎么样来制作依赖第三方.a 或者.framework 的静态库.a 尼?这篇文章演示一下制作...
  • 在使用第三方类库时,使用cocoaPods... sinstall完成所需要的第三方类库之后,在要用的地方导入(#import)发现不提示,虽然自己手写之后也可以使用,但是不提示就有写错的风险,况且写着也不方便。  我认为是工程中在i
  • 一:集成友盟分享做第三方登录现在大多数用友盟,友盟之中做第三方登录的时候首先下载sdk,然后自己看文档,其实友盟的官方文档写的已经十分清楚了,这里自己写写,做一下笔记二:详细友盟:... #import ...
  • 像我这样,在看到别的同事写demo,使用cocoaPods集成第三方框架总能自动补全头文件名,而我却不知个中原因,总是强写进来的偷懒,却是显得很low了。为此,去网上查了一下相关资料,才发现真的是so easy。下面就简单...
  • pod 导入第三方库后,使用import 不提示第三方库头文件。 解决办法: 选择target -> BuildSettings -> search Paths 下的 User Header Search Paths, 添加$(PODS_ROOT) 转载于:...
  • iOS 第三方JASidePanels侧滑  在appDelegate中导入头文件  #import"JASidePanelController.h" self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];  //定义控制器...
  • IOS可以使用CocoaPods工具类导入第三方的包1.安装pod1.1 打开"终端"查看pod版本: pod --version 如果显示: -bash: pod: command not found 就说明还没安装pod1.2 安装pod,在“终端”输入: sudo ...
  • iOS项目中使用第三方类库可以说是非常常见的事,但是要正确配置这些第三方库会非常的繁琐,还好我们有CocoaPods来做这件事情,就如同在Java的世界里有Maven和Gradle,当然Maven的作用不仅仅是第三依赖库管理。...
1 2 3 4 5 ... 20
收藏数 23,241
精华内容 9,296