xcode 订阅
Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计,编码、测试、调试都在一个简单的窗口内完成。Xcode同时也是一种语言,作为一种基于XML的语言,Xcode可以设想各种使用场景。它提供了一种独立于工具的可扩展的方法来描述编译时组件的各个方面。 [1] 展开全文
Xcode 是运行在操作系统Mac OS X上的集成开发工具(IDE),由Apple Inc开发。Xcode是开发 macOS 和 iOS 应用程序的最快捷的方式。Xcode 具有统一的用户界面设计,编码、测试、调试都在一个简单的窗口内完成。Xcode同时也是一种语言,作为一种基于XML的语言,Xcode可以设想各种使用场景。它提供了一种独立于工具的可扩展的方法来描述编译时组件的各个方面。 [1]
信息
外文名
Xcode
适    用
建立 Apple 平台程序
环    境
macOS
更新时间
2020-03-04
属    性
构件描述
版本更新
11.4 beta 3(11N132i)
支持语言
Objective-C、C、C++、Swift……
xcode背景介绍
Xcode前身是NeXT的Project Builder。The Xcode suite 包含有GNU Compiler Collection自由软件 (GCC、 apple-darwin9-gcc-4.0.1 以及 apple-darwin9-gcc-4.2.1, 默认的是第一个),并支持 C语言、C++、Fortran、Objective-C、Objective-C++、Java、AppleScript、Python以及Ruby,还提供Cocoa、Carbon以及Java等编程模式。协力厂商更提供了 GNU Pascal,Free Pascal, Ada, C#, Perl, Haskell 和 D语言。Xcode套件使用 GDB作为其后台调试工具。在Xcode 3 Unleashed中,著名的Mac开发人员Fritz Anderson编写了权威指南,以充分利用Xcode 3来构建任何Macintosh或iPhone应用程序。从Xcode 3.1开始,Xcode也可被用为iPhone OS (iOS)的开发环境。Xcode 4.0于2011年3月9日正式发行。该版本非Apple开发者注册会员亦能从Mac App Store中付费下载, 收取US$4.99的费用。从Xcode 4.1开始,针对OS X 10.6及OS X 10.7用户从Mac App Store免费下载Xcode主要版本是Xcode 5,支持iOS7,可以在Mac App Store免费下载,亦可在iOS开发者计划网站下载。Xcode6整合了苹果在WWDC大会上发布的新语言Swift1.0版本。2015年9月16日,苹果在开发者官网发布Xcode7正式版,并将Swift语言升级到2.0版本。根据斯诺登提供的资料,美国政府研究人员创建了一个版本的苹果软件应用开发工具Xcode,希望借此将监控后门植入到通过苹果应用商店App Store发布的应用程序中。2018年9月18日,苹果在开发者官网发布Xcode10正式版并将Swift语言升级到4.2版本。目前的最新版本为Xcode11,Xcode 11包含创建精彩应用程序和将应用程序带到更多设备所需的一切。 通过支持Swift软件包,Xcode 11允许在所有应用程序之间共享代码或使用社区创建的软件包。 [2] 
收起全文
精华内容
参与话题
问答
  • Xcode及模拟器SDK下载

    万次阅读 多人点赞 2014-08-11 13:39:57
    现在不会有人想在 Xcode 里安装旧版的模拟器了,本篇不再维护 --------------------------------------------------------------------------- 如果你嫌在 App Store 下载 Xcode 太慢,你也可以选择从网络上下载:...

    现在不会有人想在 Xcode 里安装旧版的模拟器了,本篇不再维护

    ---------------------------------------------------------------------------

    如果你嫌在 App Store 下载 Xcode 太慢,你也可以选择从网络上下载:

    Xcode下载(Beta版打的包是不能提交到App Store上的)

    绝对官方源!!!绝对官方源!!!绝对官方源!!!

     

    不能确定自己的 Xcode 是否有问题?简单的一条命令就能验证!

    在终端输入 spctl 命令,并带上安装的 Xcode 的路径:

    spctl --assess --verbose /Applications/Xcode.app
    

    之后会看到类似这样的结果:

    /Applications/Xcode.app: accepted
    source=Apple System

    只要结果是 accepted 而且 source 是Mac App StoreApple System、 或Apple 就表示这个 Xcode 是没问题的。

     

    Xcode 9.4:

    https://pan.baidu.com/s/1dNk9RTUoEMzKIuSlItHSTQ

    Xcode 9.3:

    https://pan.baidu.com/s/1WxhT789l4i8Db6uJhRv2IA

    Xcode 9.2:

    https://pan.baidu.com/s/1jH5G9Vo

     

    Xcode 9.1:

    http://pan.baidu.com/s/1hrA1XqO

     

    Xcode 9:

    http://pan.baidu.com/s/1i5ADN5F

     

    Xcode 9 GM Seed:

    http://pan.baidu.com/s/1cEVGEa

     

    Xcode 9 Beta 6:

    http://pan.baidu.com/s/1i59rm1v

     

    Xcode 8.3.3:

    http://pan.baidu.com/s/1jHRpE42

     

    Xcode 8.3:

    https://pan.baidu.com/s/1pKMTJjd

     

    Xcode 8.2.1:

    http://pan.baidu.com/s/1i5mq3yP

     

    Xcode 8.2:

    https://pan.baidu.com/s/1nvPPNLn

     

    Xcode 8.1 GM Seed:

    https://pan.baidu.com/s/1dFcEgs5

     

    Xcode 8:

    https://pan.baidu.com/s/1dFoNr3b

     

    Xcode 8 GM:

    https://pan.baidu.com/s/1hsoaXiW

     

    Xcode 8 Beta 6:

    https://pan.baidu.com/s/1dFia60x

     

    Xcode 8 Beta 4:

    https://pan.baidu.com/s/1mio6SD6

     

    Xcode 8 Beta:

    http://pan.baidu.com/s/1geGilnP

     

    Xcode 7.3:

    http://pan.baidu.com/s/1bw5Np8

     

    Xcode 7.3 Beta:

    http://pan.baidu.com/s/1jHjJAv0

     

    Xcode 7.2:

    http://pan.baidu.com/s/1o7frTkI

     

    Xcode 7.1.1:

    http://pan.baidu.com/s/1o61VTW2

     

    Xcode 7.1:

    http://pan.baidu.com/s/1gdpXvfP
     

    Xcode 7:

    http://pan.baidu.com/s/1dDlV5eh

     

    Xcode 7.1 Beta:

    http://pan.baidu.com/s/1mgN9QaO

    支持 10.10.4,含 tvOS beta 和 iOS 9.1 beta。这个 dmg 特别大, 之前的 Xcode 最大也就 3G 左右,这个直接超过 4.5G 了, 由于超过了百度网盘单个文件最大 4G 的限制, 于是我把它分割成了几个小的压缩包。 

     

    Xcode 7 GM:

    http://pan.baidu.com/s/1bnHgDiB

     

    Xcode 7 Beta 6:

    http://pan.baidu.com/s/1mgktpEC

     

    Xcode 7 Beta 5:

    http://pan.baidu.com/s/1mg5WC5M

     

    Xcode 7 Beta 4:

    http://pan.baidu.com/s/1c0DDvwO

    Swift 支持 Selector 了!

     

    Xcode 7 Beta 3:

    http://pan.baidu.com/s/1c06lDz6

     

    Xcode 7 Beta 2:

    http://pan.baidu.com/s/1kT4A28Z

     

    Xcode 6.4:

    http://pan.baidu.com/s/1eQhjLB0

     

    Xcode 7 Beta:

    http://pan.baidu.com/s/1c0rVSzA

    这个版本更新巨大,不仅带来了 Swift 2.0,OC 的集合类型还增加了对泛型的支持(详情看这里),如数组可以这样申明:

    @property NSMutableArray<NSDate *> *objects;

     

    Xcode 6.3.2:

    http://pan.baidu.com/s/1qWoiJtq

    只支持Yosemite,主要是修复 Bugs 和增加稳定性

     

    Xcode 6.3:

    http://pan.baidu.com/s/1bnvuibd

    这个版本只支持Yosemite,如果遇到插件不可用的情况,看这里

     

    Xcode 6.3 beta4 with Swift 1.2:

    http://pan.baidu.com/s/1jGL28Gu

    这个版本只支持Yosemite,主要改变有针对OC的Nullability特性。具体看这里

     

    Xcode 6.2 正式版:

    http://pan.baidu.com/s/1qWHSOl2

    兼容Mavericks 和Yosemite,如果遇到插件不可用的情况,看这里

     

    Xcode 6.3 beta 2 with Swift 1.2:

    http://pan.baidu.com/s/1ntDo47R

    必须要Yosemite,对Swift的语法又有一些改变(比如在if let 中可以使用条件判断了,看这里),同时编译器的警告也会变多。

     

    Xcode 6.3 beta with Swift 1.2:

    http://pan.baidu.com/s/1hqAaSYS

    必须要Yosemite,关于这个版本的详情信息,可以看这里

     

    Xcode 6.2 Beta 4:

    http://pan.baidu.com/s/1jGvc0C2

    最近这几个版本都是以修复Bugs为主,Beta 4也不例外。

     

    Xcode 6.2 Beta 2:

    http://pan.baidu.com/s/1c0pNFC8

     

    Xcode 6.2 Beta:

    http://pan.baidu.com/s/1i3xe1qH

     

    Xcode 6.1.1 GM SEED:

    http://pan.baidu.com/s/1hqKhaGO

    支持Yosemite和Mavericks。

     

    Xcode 6.1 正式版:

    http://pan.baidu.com/s/1dDtOkJv

    这个应该就是6.1的正式版了,支持Yosemite和Mavericks,包含iOS 8.1、OS X 10.10 、OS X 10.9的SDK,其中对Swift的语法和一些方法又有一些小改动。

     

    Xcode 6.1 GM seed for OS X Yosemite:

    http://pan.baidu.com/s/1gdAEFBl

     

    Xcode 6.1 Beta3:

    http://pan.baidu.com/s/1gdxNxej

     

    Xcode 6.1 Beta2(Swift 1.1):

    http://pan.baidu.com/s/1c0GPT8c

     

    Xcode 6.1 Yosemite版:

    http://pan.baidu.com/s/1bnH7LwV

     

    Xcode6 GM版:

    http://pan.baidu.com/s/1mgl1veC

     

    Xcode6 Beta7:

    http://pan.baidu.com/s/1q5u1K

     

    Xcode6 Beta6:

    http://pan.baidu.com/s/1c0peVsc

    这是修复崩溃Bug的版本,版本号是(6A280e)。国内小水管下载相当不易。。支持的顶一下。。。

    注:如果安装Xcode6 Beta6之后,编译之前的项目出现forceBridgeFromObjec以及getter、setter的问题,具体看这里

     

    Xcode6 Beta5:

    http://pan.baidu.com/s/1sjPmaW9

    可以说目前Xcode的每一个Beta版都修复了很多问题,如果你在用Beta版的话,保持最新总能解决很多疑难杂症。这一版中,对Swift的跳转定义终于变得好用了。

     

    模拟器下载

    注意:

    • Xcode 7 Beta 不支持 iOS 8.4 及之前的 SDK。
    • 现在的Xcode 6.x 似乎只支持iOS 7.0及之后的版本,早期的模拟器运行时不支持新的CoreSimulator架构,只有Xcode 5.1才支持iOS 6.x的模拟器。并且iOS 7.0的模拟器只能在OS X Mavericks里运行。

     

    旧版安装方法(Xcode 6以前的版本):

    安装SDK就等于安装了模拟器,如果你嫌Xcode下载SDK太慢的话,可以选择手动安装,具体的手动安装方法:解压后放到以下目录即可。

    /Applications/{{Xcode App}}/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/

     

    新版安装方法(Xcode 6):

    新的 Xcode 并不会识别 SDKs 目录下的模拟器,我经过一些尝试以后,发现要放在这个目录下:

    /Library/Developer/CoreSimulator/Profiles/Runtimes/

    注意:是根目录,不在 Xcode 和 User 的目录下

    而且与旧版的模拟器不同,新版模拟器是以simruntime为后缀打包的(其实还是一个目录),以7.1的模拟器为例:

    如果这个目录不存在的话,可以尝试用 root 权限创建这个目录:

     

    1. 进入终端
    2. 获取root 权限:sudo -s
    3. 再创建这个目录:mkdir -p  /Library/Developer/CoreSimulator/Profiles/Runtimes/
    4. 执行复制:cp -R  {模拟器路径}  /Library/Developer/CoreSimulator/Profiles/Runtimes/{模拟器}
      如:cp -R /Volumes/IOS\ /Xcode\ Simulators/iOS\ 7.1.simruntime  /Library/Developer/CoreSimulator/Profiles/Runtimes/iOS\ 7.1.simruntime
    5. 创建后检查目录和模拟器的权限,在 Finder 里选中目录或模拟器,按 command+i,会看到权限拥有者是 【system】而不是【你的用户名】
    6. 如果做完上面这些步骤后 Xcode 还不能正确识别出模拟器,可以尝试重启下电脑(可能重启 Finder 也行,我没有测试)

    权限不正确的情况下也能直接修改(除了模拟器本身的权限,还有它父级目录的权限):

    sudo chown -R root:wheel iOS\ 7.1.simruntime

     

    以后的模拟器我都以加密的形式分享整个目录:

    提取码:x5tx

    http://pan.baidu.com/s/1ntn7eNf

     

    如果你遇到版本号显示异常的问题,如下图:

    只需要在 Xcode 的 Devices 里将多余的相同版本的模拟器删除即可,就像下图中的 Resizable iPhone 的 8.4 模拟器重复了:

     

    以下这些下载地址过时(Xcode 6不适用):

     

    iPhone Simulator 8.0 SDK:

    http://pan.baidu.com/s/1i3CaIg9

    iPhone Simulator 7.1 SDK:

    http://pan.baidu.com/s/1dDvnQQP

    iPhone Simulator 6.1 SDK:

    http://pan.baidu.com/s/1ntGCsxN

     

    持续更新...

    展开全文
  • 同时兼容 Xcode 7 和 Xcode 8

    千次阅读 2016-09-06 15:23:39
    做为 iOS 开发者,你肯定会对 iOS 10 带来的新特性感到异常

    做为 iOS 开发者,你肯定会对 iOS 10 中的新特性感到无比兴奋,并迫不及待地想要在应用中进行实践。虽然你想马上就动手以便第一时间就能“上船“。但 iOS 10 正式上线却是几个月以后的事情,而且在那之前,你还需要保持每几周就发布一次的频率。这个情况听起来是不是跟你现在的处境很像呢?

    当然,目前你还不能用 Xcode 8 来编译需要发布的应用——因为它无法通过 App Store 的验证。所以你需要把项目拆分成两个分支,稳定分支和 iOS 10 开发分支……

    而不可避免地是,这烂透了。如果只是在分支上做一点某个特性的开发还是可以的。但是如果是持续好几个月来维护这个庞大的分支呢?不仅它的整个代码库都发生了变化,而且主分支也一直在演进,这时候你就会碰到一些不可描述的合并之痛了。我说的是,你有尝试过处理 .xcodeproj 文件的合并冲突么?

    这篇文章的目的就是告诉你如何彻底避免使用分支。对于大部分应用而言,只用一个工程文件就同时支持 iOS 9(Xcode 7)和 iOS 10(Xcode 8)是完全可能的。而且即使你不得不使用分支,这些小技巧也可以帮助你减少两个分支之间的差异,从而更舒服的对它们进行同步。

    你要用的是 Swift 2.3

    我先说明一点:

    我们都为 Swift 3 而兴奋。它很棒,但是如果你正在读这篇文章,请别用它(或者暂时别)。虽然它很好,但是它在代码层面上存在很大的不兼容,比一年前 Swift 2 的不兼容还要严重得多。而且一旦应用存在对第三方 Swift 库的依赖,就得等这些库都升级到 Swift 3,它才可以跟着升级。

    而好消息是,同时也是史无前例的事情,Xcode 8 支持两个版本的 Swift:2.3 和 3.0。

    为了防止你错过了某些通知,Xcode 7 中的 Swift 2.3 和 Swift 2.3 基本是一致的,除了少数的 API 调整(之后会详细介绍)。

    所以!为了保持兼容性,我们还是用 Swift 2.3 来进行开发。

    Xcode 的设置

    说这么多你应该已经很明白了。现在我来教你如何设置你的 Xcode 项目,让它可以在这两个版本上运行。

    Swift version

    这里写图片描述

    首先,在 Xcode 7 中打开你的项目。然后打开项目的设置页,选中 Build settings 选项,然后点击 “+“来增加一个 User-Defined 设置项:

    “SWIFT_VERSION” = “2.3”

    这个选项是 Xcode 8 新增的,所以当它告诉 Xcode 8 使用 Swift 2.3 时,Xcode 7(实际上它并没有 Swift 2.3)会完全忽略这个设置并继续使用 Swift 2.2 来进行构建。

    Framework provisioning

    Framework provisioning 的工作方式在 Xcode 8 上稍有不同——如果是模拟器,它们会按原样继续编译,而对于真机会构建失败。

    修复这个问题的方式是,遍历 Build Settings 中所有的 Framework targets 并增加如下的选项,就像 SWIFT_VERSION

    “PROVISIONING_PROFILE_SPECIFIER” = “ABCDEFGHIJ/“

    你需要把“ABCDEFGHIJ“替换成你的团队ID(你可以在 Apple Developer Portal 中找到它),然后保留最后的斜杠。

    这实际上就是告诉 Xcode 8“嘿,我是来自这个团队的,你注意下 codesign,好吗?“,然后 Xcode 7 仍然会忽略这个设置,这样就万事大吉了。

    Interface Builder

    遍历所有的 .xib.storyboard 文件,打开右侧边栏,选中第一个选项(File inspector),然后找到“Opens in“设置项。

    大部分情况下它显示的内容是 “Default (7.0)“,把它修改为“Xcode 7.0“。这可以保证即使你是在 Xcode 8 中新建的这个文件,它也只能做一些可以向后兼容 Xcode 7 的变动。

    再次提醒一定要注意在 Xcode 8 中对 XIB 所做的改动。因为它会添加一些 Xcode 版本相关的数据(不能确定的是应用上传到 App Store 之后这些数据是否会被移除掉),而且某些时候它还会尝试把文件回滚到只支持 Xcode 8 的格式(这是个 bug)。所以我们要尽可能避免在 Xcode 8 中创建 interface 文件,如果实在没办法,那么再每次提交代码的时候都要仔细 review 代码,然后只提交你需要的那几行。

    SDK version

    确保所有的项目和构建目标的 “Base SDK“设置项都被设置为 “Latest iOS“。(大部分情况下默认设置就是这样的,但是还是要再次确认下。)这样一来,Xcode 7 就会针对 iOS 9 来编译,同时同样的项目在 Xcode 8 中就可以获得 iOS 10 的新特性。

    CocoaPods settings

    如果你用了 CocoaPods, 你同样也需要更新 Pods 项目的设置,确保其 Swift 和 provisioning 的设置是正确的。

    同时你也可以通过在 Podfile 文件中添加如下 post-install 代码的方式来代替手动设置:

    post_install do |installer|
      installer.pods_project.build_configurations.each do |config|
        # Configure Pod targets for Xcode 8 compatibility
        config.build_settings['SWIFT_VERSION'] = '2.3'
        config.build_settings['PROVISIONING_PROFILE_SPECIFIER'] = 'ABCDEFGHIJ/'
        config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'NO'
      end
    end

    同样,记得把 ABCDEFGHIJ 替换成你的团队 ID。然后运行 pod install 来重新生成 Pods 项目。

    (如果发现这个 Pod 不兼容 Swift 2.3,那么你需要为 Xcode 8 单独拉一个不同的分支, 这是由 Igor Palaguta 提供的一个解决方案

    在 Xcode 8 中打开

    好了,现在就可以在 Xcode 8 中打开这个项目了。第一次打开的时候你会被大量的请求所轰炸

    Xcode 会提醒你更新到最新版本的 Swift。忽略。

    Xcode 还会建议更新项目的设置为 “推荐设置“,同样忽略。

    记住,我们已经对项目做了设置,让它可以在两个版本下都可以编译通过。所以现在我们要做的是尽量少做改动,从而保证同时兼容。更重要的是,因为我们发布到 App Store 的文件是同一个,所以我们不希望 .xcodeproj 文件中包含任何 Xcode 8 相关的数据。

    处理 Swift 2.3 的差异

    就像我之前说过的,Swift 2.3 和 Swift 2.2 是相同的语言。然而,iOS 10 SDK 的 frameworks 已经更新了一些 Swift 的注释。我说的不是大改动(那只是 Swift 3.0 的事情)——但是,Swift 2.3 的一些命名,类型和 API 的可选性还是稍微有些变化。

    条件编译

    考虑到你可能会忽略这一点, Swift 2.2 就引入了编译预处理宏。用法很简单:

    #if swift(>=2.3)
    // this compiles on Xcode 8 / Swift 2.3 / iOS 10
    #else
    // this compiles on Xcode 7 / Swift 2.2 / iOS 9
    #endif

    太棒了!一个文件,不需要分支就同时兼容了 Xcode 的两个版本

    有两个需要注意的事项:

    • #if swift(<2.3) 这种写法是不存在的,只有 >=。如果要表达相反的意思,你可以写 #if !swift(>=2.3)。(如果需要的话你还可以使用 #else#elseif)。
    • 和 C 的预处理不同,#if#else 必须是有效的 Swift 代码,例如,你不能只改变方法签名而不改变方法体。(对于这点后面会有相应的处理方案)

    可选性的变化

    Swift 2.3 中很多签名都把不必要的可选性都去掉了,而有些(比如很多 NSURL 的属性)也变成 了可选值。

    你当然也可以用条件编译来处理这个问题,比如:

    #if swift(>=2.3)
    let specifier = url.resourceSpecifier ?? ""
    #else
    let specifier = url.resourceSpecifier
    #endif

    但是下面的方法可能会小有帮助:

    func optionalize<T>(x: T?) -> T? {
        return x
    }

    我知道这有点难理解。也许你看过结果之后就会容易得多了:

    let specifier = optionalize(url.resourceSpecifier) ?? "" // works on both versions!

    这样就发挥了可选值的封装优势,从而避免在调用的时候写恶心的条件编译代码了。optionalize() 方法做的事情就是把任何传进去的值转换成可选值,除非传入的已经是可选值的情况,它就把参数直接返回。这样一来,不管 url.resourceSpecifier 是(Xcode 8)或者不是(Xcode 7)可选值,“optionalized“版本永远是一样的。

    (更深入地说:在 Swift 里面, Foo 可以被理解为 Foo? 的子类,因为你可以在不丢失信息的情况下把任何一个 Foo 类型的值封装成可选值。编译器一旦知道这点,它就允许传入一个非可选值到一个可选值参数中-把 Foo 封装成 Foo?。)

    用别名来拯救方法签名的变化

    Swift 2.3 中,一些方法(特别是在 macOS 的 SDK 中)修改了参数类型。

    比如,之前 NSWindow 的构造方法是这样的:

    init(contentRect: NSRect, styleMask: Int, backing: NSBackingStoreType, defer: Bool)

    现在变成了这样:

    init(contentRect: NSRect, styleMask: NSWindowStyleMask, backing: NSBackingStoreType, defer: Bool)

    注意看 styleMask 的类型。之前它是一个 Int 松散类型(以全局常量方式输入的选项),但是在 Xcode 8 中,它以更合理的 OptionSetType 类型输入。

    不幸的是你不能条件编译方法体相同,而方法签名不同的两个版本。别担心,你可以通过条件编译给类型起别名的方式来解决这个问题!

    #if !swift(>=2.3)
    typealias NSWindowStyleMask = Int
    #endif

    这样你就可以像 Swift 2.3 一样在方法签名中使用 NSWindowStyleMask 了。对于 Swift 2.2 而言,这个类型并不存在,NSWindowStyleMask 只是 Int 的一个别名,类型检查器仍然可以完美工作。

    非正式 vs 正式协议

    Swift 2.3 把一些之前的非正式协议 改成了正式协议。

    比如,要实现一个 CALayer 代理,你只需要继承 NSObject 就可以了,不需要声明它符合 CALayerDelegate 协议。事实上,这个协议在 Xcode 7 中根本就不存在,只是现在有了。

    同样,直接对类声明那行代码做条件编译是不可行的。但是你可以通过在 Swift 2.2 中声明虚协议的方式来解决这个问题,就像下面这样:

    #if !swift(>=2.3)
    private protocol CALayerDelegate {}
    #endif
    
    class MyView: NSView, CALayerDelegate { . . . }
    

    Joe Groff 提到过可以给 CALayerDelegate 起一个 Any 的别名——同样的结果,但是没什么开销。)

    构建 iOS 10 的特性

    至此,你的项目可以同时在 Xcode 7 和 Xcode 8 上进行编译,不需要建立任何分支,这简直太棒了!

    现在就是构建 iOS 10 特性的时候了,因为已经有了上面所说的各种提示和小技巧,所以这件事情会变得非常简单。但是,还是有一些需要注意的事情:

    1. 只用 @available(iOS 10, *)#available(iOS 10, *) 是不够的。首先,不要在发布的应用中编译任何 iOS 10 的代码,因为这样更安全。更重要的是,因为编译器需要检查这些代码,从而保证 API 的使用是安全的,这样就需要注意被调用的 API 是存在的。如果你使用了 iOS 9 的 SDK 中不存在的方法或者类型,那么你的代码就无法在 Xcode 7 中通过编译。
    2. 你需要把所有 iOS 10 专用的代码封装在 #if swift(>=2.3) 中(目前你可以认为 Swift 2.3 和 iOS 10 是相等的)。
    3. 大部分时候,你会同时需要条件编译(这样你就不会在 Xcode 7 中编译那些不可用的代码) 和 @available/#available (用来通过 Xcode 8 的安全检查)。
    4. 如果需要处理 iOS 10 独有的特性,最简单的方式就是把相关代码抽离到单独的文件中——这样一来你就可以把整个文件的内容都包含在一个 #if swift… 判断中。(在 Xcode 7 中这个文件还是可能会被编译器处理到,但是里面的内容都会被忽略。)

    应用扩展

    但问题是,你可能想要在 iOS 10 上为你的应用添加一些新的扩展,而不是仅仅给应用本身添加更多的代码。

    这就很棘手了。我们可以条件编译我们的代码,但是没有“条件目标“这种东西。

    好消息是因为 Xcode 7 并不需要真正编译这些目标,所以它并不会向你抱怨什么。(当然,它会发出警告,告诉你项目中有一个目标,它会发布到一个比 base SDK 版本更高的 iOS 版本上,但是这不是什么大问题。)

    所以方法就是:在每个地方都保留构建目标和它的代码,但是有选择地从应用构建目标的 “Target Dependencies“和“Embed App Extensions“ 选项中移除它们。

    怎么做呢?我找到的最好方式就是把构建设置中的应用扩展设置成不可用,从而默认兼容 Xcode 7。然后只有在使用 Xcode 8的时候,才临时添加这些扩展,并且从来不提交这些变动。

    如果每次都手动做,听起来太反复无常了(更别说与 CI 和自动化构建的不兼容),别担心,我帮你写了一个脚本

    安装:

    sudo gem install configure_extensions

    在提交 Xcode 项目的任何变化之前,从应用的构建目标中移除 iOS 10 专用的应用扩展:

    configure_extensions remove MyApp.xcodeproj MyAppTarget NotificationsUI Intents

    然后在 Xcode 8 中使用时,把它们添加回来:

    configure_extensions add MyApp.xcodeproj MyAppTarget NotificationsUI Intents

    你可以把这个放到你的 script/ 文件夹中,然后可以把它加到 Xcode 构建的预处理中,也可以加到 Git 的预提交 hook 上,或者集成到 CI 和自动化构建系统中。(更多信息请参照 GitHub

    关于 iOS 10 应用扩展需要注意的最后一点:Xcode 给这些扩展建立的模板是基于 Swift 3 的,而不是 Swift 2.3 的代码。所以一定要注意把应用扩展的 “Use Legacy Swift Language Version“ 构建选项设置为 “Yes“,然后把代码用 Swift 2.3 重写。

    到了9月

    到了 9 月份,iOS 10 就出来了,这个时候我们需要去掉对 Xcode 7 的支持并清理项目!

    我给你准备了一个确认清单(记得加入书签,以便后面再来参考):

    • 移除所有 Swift 2.2 的代码和不必要的 #if swift(>=2.3) 检查
    • 移除所有过渡处理,比如对 optionalize() 的使用,临时定义的别名,或者虚的协议
    • 移除 configure_extensions 脚本,然后把增加了新应用扩展支持的项目设置提交到代码库
    • 如果你使用了 CocoaPods,把它更新,然后移除之前我们添加到 Podfile 中 post_install hook(9月份以后基本就用不上了)
    • 更新为 Xcode 推荐的项目设置(在侧边栏中选中项目,然后在菜单中选择:Editor → Validate Settings…)
    • 考虑把 provisioning 设置升级,使用新的 PROVISIONING_PROFILE_SPECIFIER
    • 把所有的 .xib.storyboard 的设置回滚为 “Opens in: Latest Xcode (8.0)“
    • 确保所有依赖的 Swift 库都更新到了 Swift 3。如果没有,考虑自己给 Swift 3 这个窗口做点贡献
    • 上面的步骤都搞定之后,就可以把应用更新到 Swift 3 了!找到 Edit → Convert → To Current Swift Syntax…,选择所有的构建目标(记住,你需要一次全部转换好),review 一下 diff,测试,然后提交!
    • 如果你还没有这样做,考虑移除对 iOS 8 的支持——这样一来你就可以去掉更多的 @available 检查和其他的条件语句。

    祝好运!

    展开全文
  • 使用Xcode和Instruments调试解决iOS内存泄露

    万次阅读 多人点赞 2012-11-28 15:05:15
    虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在。所以了解原理很重要。 这里讲述在没有ARC的情况下,如何...实验的开发环境:XCode 4.5.2 1、运行Demo。 先下载一个实现准...

            虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在。所以了解原理很重要。

    这里讲述在没有ARC的情况下,如何使用Instruments来查找程序中的内存泄露,以及NSZombieEnabled设置的使用。

    本文假设你已经比较熟悉Obj-C的内存管理机制。

    实验的开发环境:XCode 4.5.2

    1、运行Demo。

    先下载一个实现准备好的内存泄露的Demo吧:leak app

    下载下来,打开运行,程序是一个寿司的列表,列出各种寿司卷。试着选择里面的几行,应该是选第二行的时候就崩溃了。崩溃截图:

     

    在崩溃的地方断住了,知道crash的地方了,但是不知道具体crash的原因。

     

    2、设置NSZombieEnabled

    这是一个 “EXC_BAD_ACCESS”错误。我们打开XCode的选项:“NSZombieEnabled” 。在crash时可能会给你更多的一些提示信息。

    设置步骤:1

    2:勾上红色框里的

    运行,按刚才的操作选中其中的cell。再次crash,这次在output窗口会看到多了一项错误信息:

     

    2012-11-28 13:22:08.911 PropMemFun[2132:11303] *** -[CFString respondsToSelector:]: message sent to deallocated instance 0x713ebc0

    大概意思是:向已释放的内存发送消息。也就是说使用了已释放的内存,在C语言相当于使用了“野指针”

    看了下crash的这个语句,sushiString应该是没问题的,它是从stringWithFormat初始化出来的。那就是_lastSushiSelected的问题。

    _lastSushiSelected指向了sushiString,sushiString是一个autorelease变量。 在第二次点击时,使用的是sushiString已经被释放,所以crash了。那为_lastSushiSelected保留一下,就可以用了。代码修改如下:

     

        _lastSushiSelected = [sushiString retain];
    

    运行,这时候不崩溃。

     

    3、分析内存泄露(shift+command+b)

    app不crash了,那看看有没有内存泄露。用XCode的Analyze就能分析到哪里有内存泄露

     

    分析之后可以看到:

    这里提示alertView没被释放,有内存泄露,那我们释放

        [alertView release];

    再分析,这个问题解决了。

     

    4、使用Instruments的leaks工具

    分析内存泄露不能把所有的内存泄露查出来,有的内存泄露是在运行时,用户操作时才产生的。那就需要用到Instruments了。

     

    按上面操作,build成功后跳出Instruments工具,选择Leaks选项,这时候寿司程序也运行起来了,选中list中的项,拖动等操作后,工具显示效果如下:

     

    大家可能都能猜到,红色的柱子表示内存泄露了。怎么通过这个工具看到在哪泄露了呢?

    先在工具栏按下红色的圆形按钮,把工具监视内存的活动停下来。选择Leak,然后点中间十字交叉那,选择Call Tree.

     

     

    这时候左下角的Call Tree的可选项可以选了。选中Invert Call Tree 和Hide System Libraries,显示如下:

     

    这时候内存泄露的具体代码找到了,在右边的红色框框里指定了哪个方法出现了内存泄露。

    你只要在这些方法上双击,就会跳转到具体的代码,哈哈,是不是很方便。

    这里应该是提示100%内存会泄露。

     

    6、解决内存泄露问题

    问题找到了,那就解决吧

    关于:tableView:didSelectRowAtIndexPath ,分析下它的内存过程:

     

    1. sushiString变量通过autorelease创建,它的引用计数是1.   
    2. 这行代码使得引用计数增加到2, _lastSushiSelected = [sushiString retain];
    3. 这个方法结束时,sushiString的autorelease生效了,这个变量的引用计数减少为1
    4. 当再次执行tableView:didSelectRowAtIndexPath这个方法时,_lastSushiSelected被赋值了新指针,老的_lastSushiSelected的引用计数还是1,没有被释放,产生了内存泄露。

     

    怎么解决呢?

    在_lastSushiSelected = [sushiString retain];之前把原来的release就ok了:

     

    [_lastSushiSelected release];
        _lastSushiSelected = [sushiString retain];

     

     

    关于:tableView:cellForRowAtIndexPath

    这个比较明显,sushiString被alloc和init之后就没有释放,可以用stringWithFormat来调用autorelease,代码如下:

     

    NSString *sushiString = [NSString stringWithFormat:@"%d: %@", indexPath.row, sushiName];
    

     

     

     

    好了,泄露都fix了,再用工具分析看看,这时候你再点,再拖,再怎么操作,都没有内存泄露了。表明内存泄露被堵住了。

     

    这是本文修复好的app代码:no LeakApp

     

    本文参考:http://www.raywenderlich.com/

    本文遵循“署名-非商业用途-保持一致”创作公用协议

    展开全文
  • [Xcode]Xcode中的编译过程以及编译器

    千次阅读 2018-02-26 21:09:45
    编译过程基本的编译过程分为四个步骤:预处理(Pre-process):把宏替换,删除注释,展开头文件,产生 .i 文件。编译(Compliling):把之前的 .i 文件转换成汇编语言,产生 .s文件。汇编(Asembly):把汇编语言...

    编译过程

    基本的编译过程分为四个步骤:
    1. 预处理(Pre-process):把宏替换,删除注释,展开头文件,产生 .i 文件。
    2. 编译(Compliling):把之前的 .i 文件转换成汇编语言,产生 .s文件。
    3. 汇编(Asembly):把汇编语言文件转换为机器码文件,产生 .o 文件。
    4. 链接(Link):对.o文件中的对于其他的库的引用的地方进行引用,生成最后的可执行文件(同时也包括多个 .o 文件进行 link)。
    然后通过解析 xcode 编译 log,可以发现 xcode 是根据 target 分开进行编译的。
    编译过程的控制,在 xcode 中可以通过 Build phases,Build settings以及 Build rules来进行控制。
    • Build phases:主要是用来控制从源文件到可执行文件的整个过程的,所以应该说是面向源文件的,包括编译哪些文件,以及在编译过程中执行一些自定义的脚本什么的
    • Build rules:主要是用来控制如何编译某种类型的源文件的,假如说相对某种类型的原文件进行特定的编译,那么就应该在这里进行编辑了。同时这里也会大量的运用一些 xcode 中的环境变量
    • Build settings:则是对编译工作的细节进行设定,在这个窗口里可以看见大量的设置选项,从编译到打包再到代码签名都有,这里要注意 settings 的 section 分类,同时一般通过右侧的 inspector 就可以很好的理解选项的意义了。

    最后,要说一下我们的工程文件.pbxproj,以上的所有的这些选项都保存在这个文件中。当然也包括 target 的信息,项目所有文件的信息,这个文件是一个文本文件,可以用文本编辑器打开。里头的内容基本是可读性比较强的。基本的思路很面向对象,每个东西都有属性,如果属性是另一个对象,值就是那个对象的一个『引用』,就是一串数字(唯一的)作为表示。每个对象都有这样的引用

      在Build phases中增加自定义脚本,每次编译都Build都递增1

    #!/bin/bash
    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

    编译器

    首先,编译器是做什么的?编译器是用来把源代码文件转换为更为低级的语言的(同时还有语句的静态分析),而 xcode 使用的clang 编译器的作用就是把源代码转换为更为低级的 LLVM IR(Intermedia Representation),这个 LLVM IR 是操作系统无关的,然后 LLVM 通过这个中间语言来进行下一步的二进制文件的产出。得益于 LLVM 的三层架构,LLVM 可以有多个输入和输出(LLVM 的第一层架构是用于处理输入的,第二层用于优化 IR ,第三层用于输出)

    llvm介绍

    llvm(底层虚拟机 low level virtual machine)是一个开源编译器框架,最早的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一。
    llvm有一个表达形式很好的IR语言,高度模块化的结构,因此它可以作为多种语言的后端,提供与编程语言无关的优化和针对多种CPU的代码生成功能。传统编译器分三个阶段:

    不同的前端后端使用统一的 LLVM IR ,如果需要支持新的编程语言或者新的设备平台,只需要开发对应的前端和后端即可。同时基于 LLVM  IR 我们可以很快的开发自己的编程语言。

    目前llvm有很多的子项目,针对不同的需求进行了深入的扩展,具体参考llvm官方首页。
    其中的Clang子项目实现了支持C/C++/Objective-C的优秀编译器前端,官方数据表明,在某些编译环境下,其编译速度要比gcc快三倍。
    展开全文
  • XCode常用快捷键

    千次阅读 2014-03-06 17:08:28
    1.导航1》切换头文件和m.文件,很实用Command + control+ 上下箭头键2》go back,回退,干嘛用啊,就是回到你上次打开的页面。control+command+ 左箭头go forward 回到你前面打开的页面control+command+ 右箭头2....
  • xcode 9.2 (13C75)工具

    千次下载 热门讨论 2015-12-09 15:18:18
    解决Xcode在ipad/iphone9.2系统真机测试时出现could not find developer disk image问题,只要拷贝这个文件到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport,然后重新启动...
  • Xcode 10.1 (xip) 官方直接下载地址(离线下载)

    万次阅读 多人点赞 2015-09-21 13:56:50
    ### Xcode 10.1 https://download.developer.apple.com/Developer_Tools/Xcode_10.1/Xcode_10.1.xip ### Xcode 10 https://download.developer.apple.com/Developer_Tools/Xcode_10/Xcode_10.xip ### Xcode...
  • Xcode省略block的参数名

    2013-01-22 02:26:13
    我为这个property设置值的时候,xcode自动设置就会省略参数名,然后成为这样: [self.segmentedControl3 setIndexChangeBlock:^(NSInteger) { code }]; 然后Xcode就会显示一个 **Parameter name omitted*...
  • /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/...
  • 在这里有Xcode历史版本的所有下载方式:https://developer.apple.com/downloads/ 下面罗列几个版本你的下载地址: Xcode7.1.1 :http://adcdownload.apple.com/Developer_Tools/Xcode_7.1.1/Xcode_7.1.1.dmg ...
  • xcode5 xcode6 xcode6.2beta网盘下载地址

    千次阅读 2014-12-11 00:32:13
    xcode5 http://pan.baidu.com/s/1qWE19fA xcode6 http://pan.baidu.com/s/1i3iRKGX xcode6.2beta
  • 最近突然发现,如果把项目里自带的lunchScreen.xib删除,或许自己创建一个View作为载入的时候,xcode会自动拉伸屏幕,所有控件都跟着屏幕等比例放大或者缩小,我想知道这样算适配吗?因为程序里打印控件大小的时候,...
  • 求大佬教教我,现在这个版本的Xcode怎么调成中文版 我按照之前的要求,找到了info,并看到了接下来的一个个项目 ![图片说明](https://img-ask.csdn.net/upload/201809/21/1537522690_561438.jpg) 然后,我点击+,...
  • Apple下载Xcode安装包

    千次阅读 2016-05-11 09:38:59
    可以通过官方地址https://developer.apple.com/downloads/...可以使用下面的链接 Xcode 77.3.1 https://developer.apple.com/services-account/download?path=/Developer_Tools/Xcode_7.3.1/Xcode_7.3.1.dmg 7.2.1 ht
  • 转:... dddddd Xcode 4.5.2正式版官方下载 http://adcdownload.apple.com/Developer_Tools/xcode_4.5.2/xcode4520418508a.dmg   xcode4.5正式版官方下载地址 http://adcdownload.apple.
  • Xcode6 新特性

    万次阅读 2014-06-03 12:53:53
    苹果在WWDC 2014上对新版XcodeXcode 6 Beta版)并没有提及过多,但它却是开发者不能忽视的一部分。Xcode 6 Beta版为设计和创建软件引入了新方法,更加关注功能和一些改善以提高开发者对平台功能的使用和扩展能力,...
  • Xcode9 新功能

    千次阅读 2017-06-26 14:41:49
    翻译: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/WhatsNewXcode/xcode_9/xcode_9.html#//apple_ref/doc/uid/TP40004626新功能概述:设备环境:Mac OSX 10.12.5、iOS11...
  • Xcode SVN配置方法

    千次阅读 2013-07-09 09:54:24
    Xcode SVN配置方法 Mac自带svn,所以我们就不需要下载了,稍稍修改一下subversion配置就能使用。大大教了两种方法:第一步,配置 Subversion Leopard中自带了SVN,但Xcode的项目文件中,并不是所有文件都适于加入...
  • 最近期末作业用cocos做了个触摸类游戏,前几天刚答辩完,老师说挺不错的让我争取搬上真机,于是小弟一咬牙买了开发账号准备打包,结果下午更新了一下Xcode,感觉整个游戏的显示都不正常了。在模拟器上只显示游戏画面...
  • XCode 4加速

    千次阅读 2012-07-12 22:50:28
    XCode 4打开时,自动加载上次的工程,需要较长时间。  这是因为Lion提供了新功能让应用程序恢复上次关闭时的状态。如果仅是临时不希望下去打开时不要打开现在使用的项目,可以在退出使用CMD+Q+OPTION代替CMD+Q。 ...
  • 今天上午把iPad mini升级到了iOS 8.0,升级... 下午试着把我们的App通过xcode 5 安装到升级到iOS8.0的iPad,结果不能识别设备了,于是到开发者中心下载最新的xcode6.0.1, 针对OS X 10.9.4系统的。注意:  Xcode 6.
  • xcode 4.5 创建项目

    千次阅读 2013-01-13 21:02:58
    一、启动Xcode 4.5,创建新的Xcode项目二、选择模板三、输入项目信息Product Name,Organization Name,Company Identifier,Class Prefix信息,选中Use Storyboard,Use Automatic Reference Counting,不选Include...
  • Xcode各个版本下载

    千次阅读 2015-05-17 15:43:42
    http://adcdownload.apple.com/Developer_Tools/xcode_6.0.1/xcode_6.0.1.dmg http://adcdownload.apple.com/Developer_Tools/xcode_5.1.1/xcode_5.1.1.dmg http://adcdownload.apple.com/Developer_Tools/xcod
  • #define SIZEOF Xcode

    2012-09-28 06:18:51
    我要做一个Xcode工程,UIView.h中的代码如下: #define FINGER_SIZE20 如何在另一个UIView中修改FINGER_SIZE的值? 然后在SecondView和UIButton中: -(IBAction)changeSize{//*****} 其中...
  • XCode8之后,由于苹果的限制,之前很好使用的插件不能直接用了。怎么办?通过以下方法,XCode8,XCode9最新版照样可以安装Alcatraz,安装插件。方法如下:1、删除以前的Alcatraz插件,通过如下两条命令rm -rf ~/...
  • Xcode怎么下载 Xcode怎么安装

    千次阅读 2017-02-07 20:03:43
    Xcode 是苹果系统上的集成开发工具,可以为 Mac OS 和 iOS 系统开发新应用。这里苹果的 Mac OS 系统为例,介绍下如何下载安装 Xcode 的操作方法。 工具/原料 Xcode 方法/...
  • 初识XCodeXCode基本操作

    千次阅读 2013-01-31 09:30:32
    (1)调整模拟器的大小 iPhone模拟器 打开模拟器,(a)选中菜单栏中硬件->设备->iPhone(Retina) (b)选中菜单栏中Window->缩放比例->50% ...选中iOS模拟器,在“Window-> 缩放比例”中就可以调整了。...
  • Xcode 5.1.1 与 Xcode 6.0.1 共存

    千次阅读 2014-10-27 13:43:15
     Xcode 5.1.1 (以下简称Xcode5)和Xcode 6.0.1(以下简称Xcode6)都是正式版本,其应用程序文件名都是“Xcode”。如果通过AppStore升级或简单地使用DMG安装包安装,新版本会直接覆盖旧版本。  升级至Xcode 6主要...
  • 今天我从Xcode7升级到了Xcode7.2,升级速度很慢,花了一个多小时。升级完成后,不能打开,报了以下警告:"使用libswiftCore.dylib插件时Xcode意外退出"。点击“忽略”和“重新打开”都不能解决问题。。 出现该问题...
  • 安装XCode

    万次阅读 2013-01-30 11:02:59
    (1)安装XCode 安装出错。 “安装器遇到一个错误,导致安装失败.请联系软件制造商以获得帮助.” 具体没有记录,大致是:由于XCode到期,修改系统日期即可,把时间向前设置为2012.01.01。 (2)安装后,找到XCode,并将...

空空如也

1 2 3 4 5 ... 20
收藏数 94,572
精华内容 37,828
关键字:

xcode