Tag: 开发

[快速] ARC,保留周期,强参考周期

。로젝트의기능구현이테스트를다가앱이느려지는다마주했습니다。 확인해보니예상대로메모리가있었습니다 중간중간끝난후여서적적적중간중간중간중간중간중간중간중간중간중간지지지지지지지지지들었습니들었습니들었습니들었습니들었습니들었습니들었습니。 swift의Memory의리가어떻게지,保留Cycle이무엇인지그스팅하겠습니스팅하겠습니다。 • 内存管理 自动参考计数(ARC)的默认值。 카운팅을하며로아주다。클래스인스턴스가카운팅을하며해할때마할때마reference强大的参考力0됬을때메모에서리에서해되는되는방식입니다 로ARC의있습니다。 •保留周期 。리가해제되지않고지되어가되어기는다말합니다。 。가가가가가가가가가가가가다 ninit的deinit应用程序deinit的应用程序。 。이해를준비하였습니다。 爸爸妈妈配偶配偶ARC가0이되지메모리에서제가되지않았습니다。 帕帕(papa)妈妈(mama)인스턴스에(nil)상이상가불다(없습니다)。 。다돌아가서보겠습니다。 제가위에서“강한”이말한것이힌트입니다。 强大,虚弱,无主的3가지방법이있습니다。 그중strong이默认이기기“때문에”순환참조인다。 。지느껴이해결사약함을이됩니다。 we(弱)레퍼런스변화하시키지않습니다。 n이남아있다면메모리를제하며변수는자동으로nil이됩니다。 때문에弱반드시可选반드시이어야합니다。 owned리고(未拥有)는는변화시키지않지값이가이가정하기타입이아닙니다。 运行时异常崩溃崩溃。 。가가는는있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때있을때 下载클로저를알아보겠습니다。 。저는용할용할복복아닌아닌아닌아닌값을됩니。 。제가있습니다。 zy기서지연변수(lazy)용한가유는이이이로로있게있게위함입니위함입니위함입니위함입니다위함입니다 (la懒的용하사용하지않으면가에러다。) info프로내에서는저에내에서는내에서는내에서는내에서는내에서는내에서는내에서는self내에서는다。 a변수의변수의변수의n n카운트는카운트는카운트는카운트는카운트는카운트는카운트는카운트는。。。。。。 말씀드린弱,无主를사있습니다。 내에서참조를하여내에서내에서내에서내에서。。。。。다。 마지막으로 。로저를지역적으로클래스와강한참조가강한참조가강한참조가강한참조로레퍼런스타입을사용하지않아도됩니다。

如何设置Bitrise来构建通用的iOS框架并部署到Cocoapods

今天,我想分享我的管道,以使用Bitrise构建和部署iOS框架。 Bitrise是适用于iOS和Android应用程序的持续集成和交付(CI / CD)服务,可帮助自动完成应用程序的运输过程,包括测试,构建,配置和提交。 实际上,它可以交付应用程序,但是仍然可以使用Bitrise交付框架或库。 建立通用框架 构建框架时,它仅包含用于构建框架的平台的符号。 这意味着,如果您为iPhone设备进行构建,则它将仅包含armv7s / arm64体系结构的符号。 同样,如果您的框架是为iPhone模拟器构建的,则仅包含X86_64 / i386的符号,并且在用于设备构建时会产生undefined symbols错误。 为了提供可在模拟器和设备上运行的iOS框架,您需要通过以下两个步骤将其构建为通用框架。 为每个平台构建两个单独的框架(iphoneos / iphonesimulator) 使用lipo命令将两者合并为一个框架。 这是制作通用框架的示例脚本,可以在Bitrise工作流程的“ 脚本”步骤中执行该脚本 。 #为设备构建 xcodebuild -workspace MyFramework.xcworkspace -scheme $ target -configuration Release -derivedDataPath $ BITRISE_DEPLOY_DIR / iphoneos -sdk iphoneos ENABLE_BITCODE = YES BITCODE_GENERATION_MODE = bitcode OTHER_CFLAGS =“-fembed-bitcode”干净的版本 #为模拟器构建 xcodebuild -workspace MyFramework.xcworkspace -scheme $ target -configuration Release […]

iOS Swift开发新闻#4

今天,我将向您展示本周发现的一些工具,这些工具可以使生活更轻松。 有了这个工具,您可以瞬间将Xib文件转换为.Storyboard。 只需选择您的xib文件,此工具即可神奇。 当您从服务中获取JSON并且想要创建Swift模型时,此工具使工作变得更轻松。 只需粘贴JSON字符串并推送它,即可在您首选的Swift版本中创建swift模型。 而且,如果您愿意,可以下载Xcode插件以在Xcode中使用QuickType,这很容易。 这是一个完整的日志记录工具,您必须将其检出。 如果您想了解更多信息并具有改进的UI,则适合您。 通过约翰·桑德尔 John Sundell在这里解释说,在进行单元测试时,有一个问题,即如何测试异步代码。 它可以是发出网络请求,在多个线程上执行工作或安排延迟操作的代码。 在谈论单元测试时,异步代码将被拒绝,但是在这里,我们有一个很好的方法来处理它。 由SwiftyJimmy 有关如何在Swift操场上运行完整的Swift项目的分步说明。 Swift游乐场将帮助您提高UI开发效率,因为您无需等待模拟器开始查看更改。 Swift 4.1带来了一些更改,其中之一就是从FlatMap到CompactMap。 我将向您展示代码: 命名:[String?] = [“ Pig”,nil,“ Dog”,nil,“ Cat”] let flatMapUse = names.flatMap {$ 0} // [“猪”,“狗”,“猫”] let compactMapUse = names.compactMap {$ 0} // [“猪”,“狗”,“猫”] 在Swift 4.1中不推荐使用FlatMap,但是在某些情况下,您现在必须使用CompactMap。 通过AppCoda Swift Generis是如此强大,在本文中,您将了解与泛型相关的所有内容,以及如何应用它们以使代码更可重用。 通用代码使您可以编写灵活,可重用的函数和类型,这些函数和类型可根据您定义的要求与任何类型一起使用。 您可以编写避免重复的代码,并以清晰抽象的方式表达其意图。

PushTrap:邮件收发器推送通知

星期四的谈话在Frianbiz上发表。 通知推送,提示和通知应用程序,以及简单的移动应用程序查询。 En effet,en’sspirant de l’outil Mailtrap,应用程序的快速测试员,développementd’une的应用程序,nous avonssouhaitéréaliser以及应用程序的模拟通知书以及意外事故发生时的通知une应用程序在生产中。 最简单的方法是:向应用程序推送通知,然后向iOS应用程序发送通知。 Côtéweb,没有足够的使用和授权通知,请按API和ainsi使者的通知进行推送。 倾倒启动器,原始应用程序Dans OneSignal,原始Apple iOS平台(视图文档OneSignal) Dans le cas d’une应用程序Laravel,nos renseignons用于标识dans le fichier .env de notre应用程序区域。 ONESIGNAL_APP_ID = MON_API * -ID **-****-****-**************** ONESIGNAL_REST_API_KEY = REST_API_KEY ************************************ 套间,源代码来自Github。 倒入公用事业公司,但必须提供必要的许可。 常量类 { static let onesignalAppId =“ MON_API * -ID **-****-****-****************” } 在应用程序中,您将使用标记实用程序来通知通知和验证标记实用程序OneSignal(将其转移到OneSignal优先级)。 总结来说,请使用Mailtrap des Notifications推送应用程序和其他功能的通知推送功能。 将OneSignal和développercette应用程序中的finaliser ce projet,temperententrélavalidation和la reception des […]

Swift初学者:Storyboardless应用程序-我删除了Storyboard,并重用了更多Swift代码和样式!

六个月前,当我检查一个Github存储库时,我意识到该存储库没有任何Storyboard,所有设计都在代码中定义。 首先,我认为以这种方式开发应用程序将是可视化UI和检查设计的噩梦,但我也看到了好处,合并Storyboard时不再有git冲突,应用样式将更容易通过代码进行,因此我决定尝试一下。 首先要做的是永久删除您的主故事板! 然后在您的AppDelegate定义一个新的根控制器: 在“部署信息”下的项目设置中,将主界面保留为空白: 完成此步骤后,您的应用将直接从代码(在本例中为MainViewController 当您需要使用情节提要板来放置布局工具时,我会通过CocoaPods使用SnapKit来帮助我进行布局。 这是代码中MainViewController定义的示例,看看对snp.makeConstraints方法的调用以及使用一些简单的Struct定义颜色和字体的Styles使用 以及对应的样式: 因此,最大的优点是我可以重用LoginViewControllers,SignUpViewControllers,关于,配置文件等,并且只需更改Styles.swift定义就可以通过应用程序重用许多代码。

在本地使用CocoaPods Lib

您已经创建了一个Lib,并希望通过CocoaPods将其安装在其他项目中,但仍想在本地使用Lib和其他项目。 为此,您将需要创建Podspec文件。 该文件将包含有关您的Lib的所有信息( 版本 , 名称 , 描述 , 依赖项 , 作者等)。 如果Podspec文件和所有必填字段已填写,则只能使用CocoaPods将此Lib放置在其他项目中。 有一个命令可以创建您的自动Podsepc,并报告所有字段都要填写。 在告诉您哪个命令之前,有非常重要的细节。 Podsepc的名称应与项目相同,如果不相同,则在尝试由其他库上的pod install安装时,将找不到它。 要创建Podspec,您应该位于Project文件夹( 您的lib )内 cd ~/Workspaces/SomeLib // Will create the file SomeLib.podspec pod spec create SomeLib // or // Will create the file SomeLib.podspec and will fill // automatically some inputs. pod spec create https://github.com/SomeLib.git 注意:如果您使用git网址。 您应该注意那里的项目名称。 例如。: 如果您使用的是https://github/some-lib.git并且Lib的名称为SomeLib,则pod […]

使用AudioKit开发-基础

本教程介绍了如何在iOS应用中使用AudioKit框架。 目标读者是经验丰富的iOS开发人员,对AudioKit几乎没有经验。 仅使用基本的AudioKit功能。 实际上,仅使用AudioKit Basics游乐场中演示的功能。 在使用本教程之前,与该游乐场一起玩可能是一个好主意。 涵盖了教程中的iOS细节,但没有详细信息。 嵌入式图形,源代码和GitHub项目应提供足够的细节。 本教程重点介绍Audikit集成,因此忽略了某些iOS特定信息(例如AudoLayout)。 1先决条件 假定熟悉使用Xcode,Swift和CocoaPods的iOS应用程序开发。 本教程练习了Basics游乐场中演示的许多功能。 因此,最好先穿过那个操场。 游乐场可以作为单独的zip文件下载,也可以克隆GitHub存储库。 可以在AudioKit下载页面上找到说明。 2创建项目 2.1创建一个新的Xcode项目 使用Single View App模板创建一个新的iOS Xcode项目(New / Project…),并提供适当的选项。 项目名称= AudioKit-Basics-Tutorial 团队=无 语言= Swift 2.2项目设置 部署信息 AudioKit iOS项目(AudioKit / AudioKit / iOS /)是使用9.0的部署目标构建的,因此我们将执行相同的操作。 部署目标= 9.0 2.3运行项目 生成项目并在Simulator(iPhone XR)中运行它,以确保到目前为止没有错误。 在运行的应用程序中应该可以看到一个空白视图,见图2.3。 此时的项目状态反映为GitHub上的v1.0版本。 3将AudioKit框架添加到项目中 可以使用包管理器(CocoaPods或Carthage)将AudioKit作为预编译框架或源添加到项目中。 有关这些选项的更多信息,请参考下载和框架页面。 3.1将AudioKit添加为CocoaPod。 本教程将AudioKit框架添加为CocoaPod,因此必须在开发计算机上安装CocoaPods。 所需步骤包括: 使用pod init创建默认的Podfile。 编辑Podfile,将AudioKit框架添加到项目中。 使用pod install安装AudioKit依赖项。 […]

使用Swift优于Objective-C的优点

一篇文章旨在强调Swift编程语言的主要优点 。 在这里,我想从一个快速的测验开始。 问题: iOS应用程序使用哪种编程语言? a)C ++ b)目标C c)迅速 显然,如果您已选择上述所有内容-您100%正确,那么在提及iOS开发时,所有提到的语言都可以使用。 但是,由于它们之间巨大的“代沟”,提到所有这些都不相同并不奇怪。 在我们的博客上阅读有关Swift和Objective-c的完整材料!

Swift 4.2有什么新功能?

又是一年中的那个时候,用于新的Swift语言更新。 4.2是Swift 4系列中继4.0和4.1之后的第二次更新。 在此博客中,让我们检查Swift 4.2中的新增功能,并记住Swift 4.2需要Xcode 10,并确保在开始之前运行Xcode 10。 枚举案例的派生集合: 引入了新的CaseIterable协议,该协议默认情况下会生成枚举中所有案例的数组属性。 我们只需要遵循CaseIterable协议,编译器就会生成allCases属性,该属性是所有枚举案例的数组。 枚举 CompassDirection:CaseIterable { 案例北,南,东,西 } print(“有\(CompassDirection.allCases.count)方向。”) //打印“有4个方向。” let caseList = CompassDirection.allCases .map({“ \($ 0)”}) .joined(分隔符:“,”) // caseList ==“北,南,东,西” allCases的自动综合仅适用于不使用关联值的enum 。 但是,如果需要,我们可以自己添加它们。 列举城市:CaseIterable { 静态var allCases:[城市] { 返回[.antwerp,.brussels,.mumbai,.hyderabad(国家名称:“印度”)] } 安特卫普案例 布鲁塞尔 孟买 大小写hyderabad(countryName:String) } 新的编译器指令: Swift 4.2引入了#warning和#error指令,它们会提示Swift编译器在编译期间发出自定义警告或错误 #warning主要用于提醒自己或其他人某些工作尚未完成。 如果提供的库需要其他开发人员提供一些数据,则#error主要有用。 #warning和#error工作方式相似。 func crypto(_字符串:字符串,密码:字符串)->字符串{ #warning(“这是可怕的加密方法”) 返回密码+字符串(string.reversed())+密码 }结构配置{ […]

使用RxSwift编码更快

人们通常谈论反应式编程,特别是RxSwift作为描述应用程序逻辑的最终方法-事件链,错误处理,异步。 但是不要忘了RxSwift还是一个工具,它允许您向任何内容添加反应式扩展。 RxSwift有一个相当大的创意社区。 RxSwiftCommunity的github配置文件当前具有55个不同大小和用途的存储库。 所有这些的根本是反应式编程。 下面我将讨论已经成为我的Podfile必需的依赖项。 Rx键盘 我们都喜欢用键盘覆盖一个密码字段,不是吗? 我不会数行代码,也不会描述我对使用NotificationCenter厌恶。 只要看看通过事件序列的概念来表达键盘高度的变化是多么酷。 让我提醒您,这里有所有Rx运算符。 您可以使用debounce ,或在此处与另一个Observable结合使用,依此类推。 这是我最喜欢的声明性代码的示例: RxKeyboard.instance.isHidden .drive(backgroundFadeView.rx.isHidden) .disposed(作者:disposeBag) 我可以解释一下,当键盘被隐藏时,我将隐藏backgroundFadeView ;如果键盘可见,则将其显示。 但是您乍一看就知道了。 手势 当UIButton不够用时,这是一种非常普遍的情况。 让我们比较一下语法: 同样,我可以解释一下,我们仅过滤.ended手势并计算翻译。 但是很明显,即使您不熟悉此框架或RxSwift。