Articles of Objective C

Swift vs Obj-C:开发人员的观点

许多对开发iOS应用程序感兴趣的人心中有一个主要问题,即应该学习Swift还是使用Objective-C来制作iOS应用程序。 现在这是一个非常普遍的问题,因为这两种语言似乎仍然是彼此的竞争者。 在Swift被Apple宣布为一种新的编程语言后,它在开发人员社区中引起了很多惊喜和困惑。 作为Objective-C的替代产品,Swift被认为比其前身更好。 但是真的是这样吗? 仅在完成了Swift中的几个主要应用程序之后(从头开始),我才能够找到这些问题的答案。 让我们从外部看一下Swift与Objective-C的战斗,并试图定义两者之间的优势。 Swift比Objective-C的优势 1. Swift更快 。 它的性能与C ++的性能相匹配,后者被认为是最快的算法计算算法。 Objective-C较慢,因为它包含C API旧版。 我们都知道苹果如何努力提高Swift的速度。 到目前为止,他们实际上已经非常成功地做到了。 例如,Swift 2.0在几种计算算法中击败了C ++。 例如,使用Swift可以更快地完成常见的搜索算法: 比Objective-C快2.6倍 比Python 2.7快8.4倍 2. Swift更安全。 Swift的语法和语言构造排除了Objective-C中潜在的几种错误类型。 这种稳定性意味着更少的崩溃和意外行为。 当然,它不能防止编写错误的代码,但是可以更好地保护开发人员避免发生不必要的错误。 可以将其称为“质量控制”。 一个很好的例子就是迅速的“可选”功能。 让我们看一下下面的实现: var firstName:字符串? firstName =“ abc” 警卫队让名=名,其他{ 返回 } //在未包装firstName的控制语句之外使用名称 print(“ \(name)”)//“ abc” 所有这些使我们有理由将Swift视为一种安全的编程语言,这非常重要。 3. Swift是竞争者 。 Swift是一种更紧凑的编程语言。 更少的代码等于更好的可读性。 当然,这个事实并不意味着代码简单。 有时,编写起来可能非常困难,但是却带来了更多好处,并且具有很高的可重用性。 这不能应用于Objective-C。 例如,有一个著名的应用程序,称为“ Lyft”。 […]

“派生数据”文件夹中有什么?

(本文最初是为我的博客 vojtastavik.com撰写的 ) 删除派生数据-每次Xcode行为异常而无明显原因时,都会有用的众所周知的技巧。 我仍然清楚地记得,当我的长辈第一次告诉我有关此基本的iOS开发技巧时。 随着岁月的流逝,并获得了更多的经验,我开始了解可以解决什么样的错误。 但是,我从未真正了解DerivedData文件夹中的确切内容 。 我决定改变这一点,这是我的发现。 注意: DerivedData的内容随Xcode版本的不同而不同。 我在这篇文章中使用了Xcode 10.0 beta 6。 我完全删除了现有的DeriveData文件夹。 然后,我从单视图应用程序模板创建了一个名为DDExample的示例项目,并在Xcode DDExample其打开。 Xcode立即创建一个新的Derived Data文件夹,其中包含两个子文件夹-一个名为ModuleCache文件夹,另一个带有项目名称的名称,后跟某种哈希。 顾名思义,这是Xcode存储预编译模块文件( .pcm )的地方。 模块是组织和共享可重用代码的方式。 几年前,模块已引入Clang(Xcode使用的编译器),主要是为了确保合理且可扩展的编译时间。 通常,对于源文件中的每个单个import ,编译器都必须包含并解析兆字节的附加头。 多亏了模块,标头仅被解析和编译一次。 您可以在其中看到两个名为AIEKQT3S8ZS7和391J0EBN0O3XH子文件夹。 这些文件夹的数量及其名称在您的计算机上很可能会有所不同。 每个子文件夹的名称均指从传递给编译器的参数计算得出的哈希值。 项目使用的唯一编译器配置越多,此文件夹中带有.pcm文件的子文件夹越多。 每个子文件夹都包含使用给定参数预编译的同一组.pcm文件。 有关此过程的更多信息: Xcode构建过程的幕后 。 值得一提的是, ModuleCache文件夹不是特定于项目的,而是在所有项目之间共享的 。 Xcode在这里存储在索引阶段收集的数据。 此数据用于项目内的搜索,快速导航和重构。 在Xcode 9之前,使用SQLite以易于理解的形式存储数据。 通过Xcode 9,Apple更改了索引数据的存储方式,现在正在使用LMDB。 没什么大不了的,因为您仍然可以打开并检查mdb文件。 但是,Apple使用的是某种哈希,而不是人类可读的密钥。 我无法进一步告诉您当前格式的工作原理,因为我找不到有关该主题的任何其他信息。 如果您有更多信息,请在下面发表评论或在Twitter上ping我。 在此文件夹中,Xcode存储按域划分的各种日志( Install , Build等)。 记住,我还没有构建项目,因此Build logs文件夹为空。 […]

UITableView iOS中的分隔线

编辑分隔线的宽度 您可以通过更改单元格上的layoutMargins:属性来设置使表格视图的分隔线在表格中扩展到各种宽度。 这可以通过多种方式来实现。 更改特定单元格的分隔线 在表视图数据源的cellForRowAtIndexPath:方法或 willDisplayCell:方法中,将单元格的layoutMargins:属性设置为UIEdgeInsetsZero(扩展到表的整个宽度),或者设置为此处所需的值。 目标C [cell setLayoutMargins:UIEdgeInsetsZero]; //也可以使用spacerInset [cell setSeparatorInset:UIEdgeInsetsZero]; 迅速 func tableView(tableView:UITableView,willDisplayCell单元格:UITableViewCell,forRowAtIndexPath indexPath:NSIndexPath){ cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero } func tableView(tableView:UITableView,cellForRowAtIndexPath indexPath:NSIndexPath)-> UITableViewCell { cell.separatorInset = UIEdgeInsetsZero cell.layoutMargins = UIEdgeInsetsZero } 删除所有分隔线 每个单元格之间的细灰色线可能并不完全是您要的外观。 将它们隐藏起来非常简单。 在您周围的UIViewController的viewDidLoad:方法中,添加以下代码。 您也可以在加载或重新加载表视图之前随时设置此属性(不一定需要在viewDidLoad:方法中)。 迅速: tableView.separatorStyle = .None 目标C: tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 另外,可以通过选择tableView并将分隔符(在属性检查器下)设置为None来在Storyboard或XIB中更改属性。 隐藏多余的分隔线 您可以通过在UITableView的底部设置一个空的页脚视图来隐藏空单元格的UITableViewCell分隔线: 迅速 tableView.tableFooterView = UIView() […]

目标C中的局部和全局类型变量

可以在声明它们的方法内访问局部变量,但不能在此方法之外使用它们。 让我们通过示例来了解它。 让我们创建一个将两个数字相加的方法,如下所示。 -(void)AddTwoNumbers:(int)a SecondNumber:(int)b { int结果= a + b; NSLog(@“输出=%d”,结果); //输出:output = 30 } 在这里,变量a和b都是方法参数。 结果是在AddTwoNumbers方法中声明的局部变量。 由于在方法中声明了它,因此您只能在此方法中使用它。 例如,我们使用变量c打印其值。 如果您尝试将结果打印到另一种方法中,则Xcode将不允许这样做,而是会给您错误。 请检查以下屏幕截图以了解局部变量。 这是局部变量的正确使用 这是对局部变量结果的错误使用 可以在整个类文件中的任何位置访问全局变量 。 它们在头(.h)文件中声明。 在上面的示例中,如果要访问viewDidLoad方法中的结果,则将结果声明为ViewController.h文件中的全局变量,如下所示。 ViewController.m文件将如下所示。 希望您了解局部和全局变量及其用法和范围。 谢谢您阅读🙂 请查看我的YouTube频道以获取视频教程并订阅,并与您的朋友分享。 youtube频道链接: https : //www.youtube.com/channel/UCWjT8XgKescscxlPbMSVzbQ

Swift比目标C快多少

支持动态库。 Swift支持的动态库,它们直接加载到应用程序的内存中,可以优化应用程序的性能。 与应用程序的直接连接允许它们独立于操作系统进行更新。 它有助于使您的解决方案保持最新状态,减小应用程序大小,并加快新内容的加载时间。 Objective-C不支持动态库,这是一个主要缺点。 事实是它们更大,因为外部程序内置在可执行文件中。 动态库较小,因为动态库只有一个副本存储在内存中。 2. 运行时代码编译 目标C使用运行时代码编译,而不是编译时间。 这意味着当Objective-C对象在代码中调用另一个对象时,将涉及额外的间接级别。 通常,这发生得非常快,但是当代码编译发生很多次时,它变得可以测量,而swift需要更少的编译时间。 3. 参考类型与值类型 Swift的String,Dictionary和Array是结构。 这意味着它们是值类型的,并且不支持继承,因此Swift可以静态链接并可以内联调用其方法。 它们也是写时复制的,因此,如果您仅从这些数据结构之一中读取数据,Swift可以通过边界检查将许多访问转换为指针算法。 4. 常量和可选的用法 与C相比,Swift允许和鼓励使用常量的次数更多。 优化器可以假设常量永远不会改变-甚至禁止使用后门技术(例如对常量形成UnsafePointer)-这样它就可以安全地缓存先前获取的值并执行其他优化。 可选选项可确保某些指针永远不会为nil,因此编译器可以省略nil检查。 6. 更多注意事项 Swift对象可以彼此调用,而无需执行消息发送,这是Objective-C性能的瓶颈。 Objective-C的对象具有神奇的属性,可以对消息进行自省和动态处理。 这是非常强大的功能,但是会增加每条消息的成本。 迅捷对象不需要此。 因此可以更加轻巧。 从理论上讲,没有理由说Swift代码不能跟C ++一样快。 在简单的测试中,将优化器设置为“ 11”,Swift代码似乎具有与C / C ++类似的性能。

iOS:使用IBInspectable

顾名思义,本教程将指导您如何直接通过IBInspectable(InterfaceBuilderInspectable)从Interface Builder设置控件上的自定义值,我们可以创建可以在Interface Builder中检查的属性。 让我们以按钮为例,假设我们必须在按钮上设置拐角半径或边框宽度或颜色。 创建UIButton的子类,并使用IBInspectable添加以下属性,并实现其setter和getter 现在选择“属性”检查器。 您将看到自定义属性出现。 您可以设置所需的值而无需编写任何代码。

@objcMembers让我傻了

假设您有一个要在Obj-c中使用的Swift类。 通常,您只需使用@objc属性标记该类及其属性。 但是,如果您的类具有很多方法和属性,而不是使用@objc标记每个方法和属性,则可能更聪明的方法是使用@objcMembers属性,该属性将标记对您而言在Obj-c中可见的所有内容。 现在,这是有趣的部分。 根据苹果 将@objcMembers属性应用于类会隐式地将@objc属性添加到其所有与Objective-C兼容的成员。 这样一来,您将认为对于我的示例类来说,两种方法是平等的。 好吧,他们不是。 实际上,这些是: 为什么对我来说意味着什么? 假设您已经使用@objc作为NSObject的子类声明了该类。 该类是Swift框架的一部分,在其他一些Obj-c项目中用作依赖项。 出于某种原因,例如在重构期间,您决定从NSObject中删除继承。 这个故事如何结束? 或多或少像这样: 可是等等! 通过使用@objcMember,您很聪明,因此您得到了…… 没错 没有警告。 没有。 就这样

内容模式| 迅速

Entenda os modos como oconteúdopode ser tratado pela视图。 存在三种内容模式,即:scaleToFill,scaleAspectFit,scaleAspectFill。 致辞,致辞,致谢。 原理上的区别是,视图的比例是正确的。 .scaleToFill(escalar para preencher) Esseéo modopadrão,ele escala oconteúdopara preencher toda的景色,messque que issofaçaconteúdoperderaproporção。 如果需要,可以通过更改内容的纵横比来缩放内容以适合其自身大小的选项。 .scaleAspectFit(escalarproporçãopara ajustar) 可以按比例进行管理,可以从视图中进行预览,可以从视图中进行任何操作。 通过保持纵横比来缩放内容以适合视图大小的选项。 视图边界的所有剩余区域都是透明的。 .scaleAspectFill(escalarproporçãopara preencher) 前面的视图,视图的顶部,视图的顶部,视图的顶部,视图的顶部和底部,视图的顶部和底部。 缩放内容以填充视图大小的选项。 内容的某些部分可能会被裁剪以填充视图的边界。 Outros Modos: 您可以在原始视图中进行操作,也可以在视图中保留视图。

每个iOS开发人员都应使用的10个开发工具

这是我在Medium上的第一篇博客文章,我想将其专门用于开发工具,这些工具可以节省很多宝贵的时间,从而使我们(至少是我的)生活更加轻松。 对我来说,在项目上工作时最重要的是要提高生产力,并且要实现这一点,我必须找到并使用能够帮助我花更多时间并专注于实际应用功能及其复杂性的工具。 直截了当,这里是我每天使用的工具: JSON Accelerator –一种在Objective C中处理JSON数据的更好方法。当处理JSON并创建各自的模型时,这变得很痛苦。 JSON Accelerator将遵循SOLID原则自动创建模型。 就我个人而言,这是我无法缺少的工具。 它会在不到一秒钟的时间内为所提供的JSON数据生成所需的文件,而不会花费数小时手动创建它们。 不幸的是,它仅支持Objective-C,因此对于Swift,我正在使用SwiftyJSONAccelerator来完成相同的工作。 Prepo –准备,共享和预览App图稿和图标。 拖放图稿以将@ 3x和@ 2x快速转换为@ 1x,并在上下文中预览Icon图稿。 Prepo将所有图稿存储到项目窗口中,以准备批量导出,或将QuickDrop用于@ 3x和@ 2x的超快速大小调整。 您是否曾经从设计师/客户那里收到过一种尺寸不正确且命名错误的资产? 好吧,它经常发生,它们会让您处理其余的事情……该工具可以帮助您解决这种情况,因为它将所有资产转换为所需的大小,并为您正确命名。 它还可以将您的应用程序图标转换为所有所需的大小。 CocoaControls –是一个了不起的网站,您可以在其中找到超过5000个Swift和Objective-C开源GitHub库。 因此,下一次,而不是四处寻找应用程序所需的一些UI组件,只需访问该站点,您将找到所需的一切。 Postman –是一款用于与HTTP API进行交互的Google Chrome应用。 它为您提供了一个友好的GUI,用于构造请求和读取响应。 我的实践是在项目中实现API之前先构建和测试它们。 它拥有超过300万用户。 CocoaPods –是Swift和Objective-C Cocoa项目的依赖项管理器。 它拥有超过32,000个库,并在超过210万个应用程序中使用。 CocoaPods可以帮助您优雅地扩展项目。 我必须在我从事的每个项目中都包含的另一种工具…除了在整个项目中保留外部库并在添加它们之后遇到各种问题之外,您还可以使用CocoaPods以一种优雅的方式解决所有问题,并将所有内容都保存在一个地方一些终端命令行。 JSON Formatter –您是否曾经收到没有格式的JSON响应,而您几乎无法理解其结构? 这就是为什么我开始使用此Google Chrome扩展程序的原因,并且浏览器中的JSON响应不再出现视觉问题。 我建议您也这样做,并且保证您会喜欢自动格式化的回复。 Sympli –与Photoshop,Sketch,Android Studio和Xcode合作的团队的设计移交和实施。 我必须说,对于一个可加快您的UI实施速度的插件而言,这是一个非常有趣的概念。 这就是它的工作原理……创建一个项目,然后设计师从Web版本添加他的文件,然后转到Xcode项目并安装插件,只需按一下按钮,它将在UIViewController和还为组件创建所需的插座。 这个插件没有太多经验,但是我鼓励您尝试一下并分享您的印象。 我还将分享一些未在开发中直接使用的工具,但它们也是重要的一部分: SearchMan –如果您在AppStore上拥有自己的应用程序,并且想跟踪您的关键字排名和应用程序的可见性,则可以使用此免费的ASO工具,该工具将为您提供有关应用程序位置的见解。 […]

了解Objective-C现代化

对于iOS开发人员而言,Objective-C现代化确实非常重要。 它提供了更好的类型安全性,并改善了与Swift代码库的交互。 现有代码库的这种现代化包括但不限于: 可空性注释 用NS_SWIFT_NAME快速重命名 带有NS_SWIFT_UNAVAILABLE限制API 用NS_TYPED_EXTENSIBLE_ENUM / NS_TYPED_ENUM相关的ObjC常量进行分组 这是所有文章的清单 第1部分:可空性注释 第2部分:泛型(下一个版本) 第三部分