Tag: Objective C

iOS的Model View Controller dengan contoh

首先,tulisan ini menggunakan bahasa pemrograman Objective-C和karena gue lagi memperdalam Objective-C。 Jika kalian ingin membutuhkan tulisan yang menggunakan Swift,silahkan cari tulisan lain。 Atau,tertarik untuk转换为Swift吗? Sebagai seorang前端开发人员,移动开发kerasa susah nya。 Terlebih gue terbiasa menggunakan arsitektur MV *,仅维护每个组件的状态,Jadi ketika ingin实现了MVC di iOS,那么,gue mulai dari mana ya吗? Sebenernya bisa aja enggak peduli pakai arsitektur apaan,yang penting kode beres dan enggak […]

25个IOS面向初中开发者的面试问题和答案。

您好,我叫James Rochabrun,请允许我抛弃这个免责声明 ,但是,现在说这还为时过早。 正如您在本期或以后的帖子中将会看到的那样,英语不是我的母语,因此,如果您对语法犯罪敏感,那么这是离开此页面的最佳时间,我不会个人化,不会有任何感觉伤害。 Phhhhhhiiewwww说了这句话,我的内心不再感到内,这让我深入了解了真正重要的事情。 我是一名IOS开发人员,是一名自学成才的人,没有计算机科学学位,但是对代码充满好奇和热情,我刚刚在旧金山完成了一个iOS Bootcamp,并为两家初创公司工作,为他们的应用开发新功能。 我目前正在从事自由职业项目,但我正在积极寻找更稳定的工作。 就像许多本人一样刚进入该领域的开发人员一样,我目前正处于人生苦闷的时期,被称为“接受过技术职位面试”; 没错…长长的电话,白板测试了所有有趣的东西。 第一次面试中的一个错误答案可以确定您是否找到了工作,或者只是“感谢您的参与”电子邮件。 这就是为什么对我来说(有时您会学习“教学”对吗?),我想分享我从与Wells Fargo,Facebook等公司的访谈以及在线论坛和网站中收集的一系列不错的iOS问题。 1 —什么是内存泄漏? 内存泄漏是一种资源泄漏,当计算机程序以不释放不再需要的内存的方式错误地管理内存分配时,会发生这种情况。 在面向对象的编程中,当对象存储在内存中但无法被运行的代码访问时,可能会发生内存泄漏。 2-描述“应用程序稀疏”是什么意思? 商店和操作系统通过根据用户特定设备的功能量身定制应用程序交付,从而以最小的占用空间优化了iOS,tvOS和watchOS应用程序的安装。 这种称为应用程序细化的优化,使您可以创建使用最多设备功能,占用最少磁盘空间并容纳Apple可以应用的将来更新的应用程序。 3-什么是自动版式? 自动版式会根据对这些视图施加的约束来动态计算视图层次结构中所有视图的大小和位置。 4 —什么是GCD? 如何使用? GCD是最常用的API,用于管理并发代码和在系统的Unix级别异步执行操作。 GCD提供并管理任务队列。 一个很好的例子是,当应用程序从API获取数据时,此网络调用应在后台线程中进行,并且视图中的数据显示应在主线程中执行,以及任何UI更新。 5-Swift比Objective-C有什么好处? Swift更容易阅读。 (真的吗?) Swift更易于维护。 Swift更安全。 Swift与内存管理统一。 Swift需要更少的代码。 Swift更快。 与开源项目的名称冲突更少。 Swift支持动态库。 Swift Playgrounds鼓励交互式编码。 Swift是您可以影响的未来。 这是一个链接,您可以在其中详细查看这些断言。 6 —什么是GCD中的“同步”与“异步”? 这些术语描述了函数何时将控制权返回给调用者,以及到那时将完成多少工作。 同步函数仅在完成其订购的任务后才返回。 另一方面, 异步函数立即返回,命令任务完成但不等待它。 因此,异步功能不会阻止当前执行线程继续进行下一个功能。 7 —为什么在块中使用self时通常会创建弱引用? 为了避免保留周期和内存泄漏。 8 —您调用什么GCD方法以异步方式将一些工作传递到队列? 您为此方法提供哪些参数? […]

如何开始学习iOS

2年前,我以iOS开发人员的身份开始了自己的旅程,最近我在思考它,我是如何开始的(我是一个自学成才的人),我所经历的挣扎和我决定写一篇关于它的文章,我使用了哪些资源以及更多。 在继续阅读资源列表之前,需要记住一些事情: 我更喜欢阅读复杂的范例,而不是看教程,因为我想在编写任何代码之前有自己的步调并很好地理解事情。 许多iOS开发人员不喜欢我的使用方式(“阅读”),而是喜欢看教程。 您将在下面看到的列表假设开发人员已经了解一些编程知识。 好吧,现在让我们深入研究有趣的东西: Swift的语法 在开始学习Xcode之前,我强烈建议您从Swift的语法开始。 您可以从多种资源中学习,但到目前为止,我发现的最好的东西是Apple在iBook商店中拥有的书“ The Swift Programming Language(Swift 3)”。 来自 www.raywenderlich.com 的iOS学徒系列 就像我说的,我更喜欢读书而不是看书。 因此,我买了这本书,并完成了每个应用程序/练习。 照着做。 动手 不要只是阅读或观看示例。 尝试1-2周以创建您的想法的MVP。 例如,如果您想创建一个待办事项列表。 去做吧。 您将学到很多有关表格视图,手势和姿势的新知识。 另外,作为第一个项目的待办事项清单也是IOS开发中有许多功能的一个很好的例子。 必需品 在学习iOS时,您可以做的另一件事是观看WWDC视频。 它们的介绍非常好,具有教程,您可以学到很多新东西。 例如,当我观看几个WWDC会话时,我对Auto Layout的理解更好。 其他有用的结论 从最近的两年快速学习和编码中,我了解到每个iOS开发人员都会以一种或另一种方式“面对” Objective-C,因此,我强烈建议先学习Objective-C,然后再学习Swift。 我做了相反的事情,这比我想的要困难得多。 在学习过程或“构建应用程序”过程中,您将面临很多问题。 要记住的是要有耐心,当您的代码有问题时,请不要犹豫寻求帮助或在堆栈溢出中提出问题。 iOS开发人员的Twitter社区也非常友好,他们可以为您提供很多帮助。 如果您在此问题上有任何问题,请联系我@AgisilaosTs。 最后的想法 我喜欢iOS开发。 了解每个人如何成为开发人员真是太好了。 。 在开始使用iOS之前,我有一点C ++经验。 上面的列表对我非常有用,我学到了,当然,我每天都在学习新事物。 我希望这也能为您服务。

iOS并发-真相

在开发iOS应用时,无法逃避并发或线程问题。 在许多情况下,都非常需要线程,队列和并发的概念。 这些泛泛的概念确实非常广泛,但是对于苹果公司而言,在开发应用程序时,它本身就可以管理很多线程方面的事情。 首先让我们谈一下并发性—真正的意义是什么,为什么会如此重要。 确切地说, 并发是由CPU处理多个任务 ,仅此而已,没有什么大不容易理解的词:)。 早期的Apple设备安装了1个CPU,可以在多个任务之间进行上下文切换。 2011年晚些时候,iPad和iPhone升级为双核,是的,这是一个很大的举措。 苹果提供了可以用于执行简单任务的GCD(Grand Central Dispatch)和通常用于执行复杂任务的操作队列。 之所以需要并发专业知识的原因之一是保持UI响应能力,这可以通过以下示例来理解:在UITableView中需要滚动图像,而其下载和转换图像则需要时间并且有点慢,因此建议这样做在除主线程之外的其他线程上运行这些任务。 注意:默认情况下,所有UI更新任务都在主线程上执行。 如果我们在主线程上执行繁重或复杂的计算,那么它将导致您的应用程序的UI阻塞并使其无响应。 修改或更新相同资源的任务一定不能同时运行,我们需要确保资源是线程安全的。 术语“任务”和“过程”通常可以互换使用。 不幸的是,术语“多任务”通常用来表示一次管理多个进程的能力,而“多处理”是指具有多个处理器(CPU)的系统。 我们可以创建自己的线程,但是在没有专业知识的情况下使用此选项可能会导致很多问题。 在将任务分配给GCD或操作队列时,系统将自己管理线程。 我们可以创建多个任务并将其分配给队列。 每个任务分为多个单元,每个单元由可用线程执行。 系统将任务分解为多个单元并将其分配给线程。 在下面给出的图中,我们有一个包含6个任务的队列,该队列分为2个线程,“线程1”执行4个任务(紫色,黄色,红色和绿色),“线程2”执行2个任务(蓝色,橙色)。 在GDC和Operation队列之间进行选择取决于我们希望任务之间或与主线程进行通信的方式,因为两者都提供了使同步函数异步运行的各种方法。 一个人在处理并发时可能会面临3个主要潜在问题,而前两个可以通过使用GCD或Operation队列来解决: 比赛条件 优先级倒置 死锁 竞争条件:当两个线程尝试同时访问或更改同一资源时。 这完全取决于线程的调度方式以及它们的启动,睡眠和恢复时间。 Xcode 8具有Thread Sanitizer或TSan来找出潜在的竞争条件代码。 下图显示了通过两个线程访问资源的理想情况,其中线程在不同的时钟周期访问值以进行读/写。 但是有可能在线程2的写操作之前完成了线程2的初始化和读取操作,这在线程2的写语句之后给出了不一致的结果。 这可以通过下面给出的图表来理解。 竞争条件可以通过锁定将使另一个线程等待其完成工作的值来解决,也可以通过将串行任务一次限制在一个特定资源中来使用串行队列来解决。 优先级倒置: 当高优先级工作变得依赖于低优先级工作时,或者成为低优先级工作的结果时,就会发生优先级倒置 。 结果,可能会发生阻塞,旋转和轮询。 在同步工作的情况下,系统将尝试通过在反转期间提高较低优先级工作的QoS(服务质量)来自动解决优先级反转。 在以下情况下会发生这种情况: 当为串行队列上的块调用dispatch_sync()和dispatch_wait() 。 当互斥量由具有较低QoS的线程持有时,调用pthread_mutex_lock()时。 在这种情况下,将持有锁的线程提升到调用方的QoS。 但是,跨多个锁不会发生这种QoS提升。 在异步工作的情况下,系统将尝试解决串行队列上发生的优先级倒置。 让我们考虑一个示例,其中存在3个任务– task1,task2和task3,它们分别具有低,中和高优先级,它们需要一个公共资源。 首先, task1开始执行并锁定资源,而task2启动并暂停task1,但是由于它被task1锁定,它将无法访问公共资源,同时task3启动并暂停task2并开始执行,因为它具有较高的优先级,但是当它需要公用资源,因为它仍被task1锁定,因此它被阻塞。 在这种情况下,低优先级任务和中优先级任务被高优先级任务停止,而需要公共资源的高优先级任务被低优先级任务停止,这是优先级倒置的经典情况,如下所示: […]

iOS上的事件传递:第3部分

我们已经通过iOS中的事件传递系统结束了旅程。 在介绍目标动作模式如何工作以及如何使用某些相同的API沿响应者链发送自定义事件之前,让我们回顾一下到目前为止所涵盖的内容。 在第1部分中,我们研究了UIKit如何通过点击测试处理触摸事件以及手势识别器在系统中的位置。 我们还简要地研究了响应者链如何处理这些触摸事件,包括它们遵循的到达视图和视图控制器层次结构的路径。 在第2部分中,我们介绍了UIResponder中定义的其余事件,以及有关Responder Chain如何运行的更多信息。 目标行动 UIKit大量使用目标动作模式。 它在UIControl中定义。 让我们看一看UIControl标题的代码段。 NS_CLASS_AVAILABLE_IOS(2_0)@interface UIControl:UIView —-剪断—- -(void)addTarget:(nullable id)目标动作:(SEL)ControlEvents的动作:(UIControlEvents)controlEvents; -(void)removeTarget:(nullable id)目标动作:(nullable SEL)针对ControlEvents:(UIControlEvents)controlEvents的动作; -(NSSet *)allTargets; -(UIControlEvents)allControlEvents; -(nullable NSArray *)actionsForTarget:(nullable id)target for ControlEvent:(UIControlEvents)controlEvent; -(void)sendAction:(SEL)action to:(nullable id)target forEvent:(nullable UIEvent *)event; -(void)sendActionsForControlEvents:(UIControlEvents)controlEvents; —-剪断—- 这些方法定义了目标动作模式。 该模式使我们可以定义要处理的事件,接收事件的目标以及要发送到目标的动作(消息)。 事件和动作的这种分离还使我们可以为一个或多个动作定义多个收件人。 有关UIControl和目标动作模式的更多信息,请查看Apple的UIControl文档。 那么,这与活动交付相适应吗? 当前, UIControl使用带有类似于以下内容的调用跟踪来发送操作: 框架#0:-[BPXLTableViewCell cellButtonTapped:] 框架#1:-[UIApplication sendAction:to:from:forEvent:] 框架2:-[UIControl sendAction:to:forEvent:] 框架#3:-[UIControl _sendActionsForEvents:withEvent:] 框架4:-[UIControl touchesEnded:withEvent:] 框架5:_UIGestureEnvironmentSortAndSendDelayedTouches —剪- 这里重要的API调用是-[UIApplication […]

在iOS应用程序中实现用户标记

我确信有很多方法可以在应用程序中实现标记,但是我在这里写此博客是为了以更简单的步骤实现它。 因此,在不浪费更多时间的情况下,让我们更深入地研究这些步骤。 我用图书馆河川 用于在Curofy iOS应用程序中实现用户标记。 Hakawai是UITextView的子类,具有其他功能和对插件的支持。 我使用控制流插件在Curofy App中实现用户标记。 只需输入“ @”,实体列表就会打开供选择。 HAKAWAI入门 如果要在同一视图控制器类中实现textView委托功能,请使用HKWTextView实例创建UIViewController并将其externalDelegate属性分配给此视图控制器。 创建一个帮助程序类,以实现HKWMentionsDelegate中提到的必需功能。 将HKWMentionsPlugin实例的委托属性分配给您的帮助器类的实例。 设置textView实例的controlFlowPlugin以注册该插件。 一些代码片段的实现 让我们从我的应用程序快照开始: 此屏幕代表我的UIViewController,其中包含HKWTextView。 ChooserView是自定义的ChooserView,带有UITableView并带有HKWMentionEntity作为用户对象,其中包含用户的详细信息,例如名称,用户名,专业等。 在此,控制流字符为“ @”。 键入后,选择器视图将打开,以HKWMentionsChooserPositionMode作为HKWMentionsChooserPositionModeCustomNoLockArrowPointingUp进行选择。 从选择器视图中选择实体,并在所选字符串上添加带有属性字符串的提及。 您还可以通过实现修剪HKWMentionEntity名称所需的功能,以所需的方式修剪提到的字符串。 以下是一些代码片段,其中包含使用HAKAWAI的说明: 创建HKWMentionsPlugin的实例,并使用实现HKWMentionsDelegate所需功能的助手类“ CustomHKWChooserViewManager”的实例设置其委托。 这里的HKWMentionsPlugin的ChooserView类是’CustomHKWChooserView’,因为我没有使用插件中提供的默认ChooserView。 CustomHKWChooserView包含UITableView,该UITableView包含包含有关相应实体的详细信息的单元格,这些单元格需要显示在列表中以供选择。 这里的“ UserTagMentionCell”是UITableViewCell ,它显示包含在UITableView中的供选择的HKWMentionEntity ,用作自定义的插件ChooserView。 ‘tagPaginator’是Paginator的实例,可用于分页,以便从服务器中获取匹配当前页面索引的键入字符与控制字符’@’的服务器的用户对象列表(紧随HKWMentionsEntityProtocol )。 每当文本发生变化时,在HKWTextView中输入的字符串中,在创建的提及中添加属性字符串。 您还可以在提及实体的名称上以正则表达式的形式进一步添加超链接,以使其在应用程序中的任何显示位置均可单击。 喜欢,我添加为 -(NSString *)createHyperLinkWithEntityName:(NSString *)entityName和EntityId:(NSString *)entityId { 返回[NSString stringWithFormat:@” <>”,entityName,entityId]; } 您还可以在视图中添加操作按钮,以实现在HKWTextView的文本中插入控制字符的功能,以进一步实现用户标记,如之前针对应用程序所述。 最后,我想说HAKAWAI是一种功能强大的API,可以启用许多其他功能,例如, 使用自定义文本视图容器 使用textView自动更正,或根据用途启用或禁用它们。 支持带有内置属性字符串的自定义属性文本,以供提及插件实体显示。 轻松处理文本视图的纯文本和属性文本的添加,删除或文本转换。 实现一个自定义布局管理器,默认情况下,文本容器修复了多个UITextView错误。 还有更多… […]

CAGradient与UIImage渐变性能比较

CAGradient , CAGradient速度很慢,我们应该使用UIImage渐变代替它。 让我们来看看。 TL&DR:具有shouldRasterize = NO CAGradient与UIImage具有相同的性能,并且比具有shouldRasterize = YES更快。 在比较它们速度的第一个实验中,我创建了带有UITableView和每个UITableViewCell内部的渐变的示例项目。 每个单元格都在prepareForDisplay重绘其渐变,因此我们可以测量渲染时间。 共有三种类型的渐变: CAGradientLayer(红色) 带有shouldRasterize == YES (绿色) UIImage渐变(黑色)

Objective-C与Swift。

这就像老与新,青年与经验之战,父亲与儿子之战。 所有很酷的孩子似乎都喜欢Swift,并且对其周围的炒作非常庞大。 尽管像Crusty这样的年长者和经验丰富的人似乎忠于Objective-C。 那么谁是对的? 而且,更重要的是您应该怎么做? 我决定在一篇文章中汇总所有可用信息,因此无论您是经验丰富的开发人员还是iOS开发的全新人员,您都可以决定。 至少,您了解的越多越好。 初始信息 在WWDC 2006中引入了Objective-C 2.0,但它似乎已经存在了数十年。 最初的Objective-C于1984年首次出现,因此它已有32年的历史了! Objective-C是一种开源语言,主要用于Apple平台(macOS,iOS等)。 根据redmonk.com的研究,Objective-C是第十大最受欢迎的编程语言。 Github的这篇文章表明,2014年它是第9种语言,但在2015年不再排名前10位。 至于薪水,除了qz.com上的这张表,我什么都找不到。 但这真的过时了。 Swift是在WWDC 2014中引入的,在撰写本文时,该编程语言已经有了第3版。 它是开源语言,主要在Apple平台上使用。 由IBM积极传播。 据redmonk.com称,它现在是历史上第17种最受欢迎​​的编程语言,也是增长最快的语言。 所有新的代码示例都是用Swift编写的,大多数博客作者都使用它。 因此,您可能现在就想:“为什么我要浪费时间阅读本文-我绝对应该学习Swift!”。 我完全同意。 您应该学习它。 但是您应该在下一个项目中使用它吗? 您是否应该忽略Objective-C作为新的iOS开发人员? 让我们仔细看看。 目标C 我将重点关注使用Objective-C并学习它的利弊。 优点: Objective-C是一种成熟的语言,具有庞大的社区,许多经验丰富的开发人员,最佳实践和编码风格。 许多大型项目中都使用了许多经过良好测试的第三方库。 ( 注意:其中一些可能不会更新到最新的iOS版本 ) 有大量的旧代码需要得到支持。 (特别是对于Crusty) 与其他语言的兼容性。 您可以在Objective-C文件内毫无问题地使用C或C ++。 如果需要在Swift代码中使用C ++,则应先将其包装在Objective-C代码中,然后再将其导入Swift中。 缺点: 早晚Objective-C将无法支持某些新功能,因此将有仅Swift标记的方法和框架。 它是一种过时的语言,缺少其他编程语言中提供的许多有价值的功能。 (看看Swift枚举和哭泣) 因此,基本上,如果您已经在Objective-C方面拥有丰富的经验,并且知道一些C / C ++,那么在接下来的5年或至少在苹果成为主要公司之前,您会做的很好。 永远有一个利基为您。 迅速 使用Swift的优点如下: […]

iOS:如何在Xcode项目中使用FontAwesome。

对图标使用超赞字体的好处是,您可以像对待文本一样对待它们。 它消除了使用同一图标的各种大小或各种颜色的png的需要,因为您只需设置字体大小或字体颜色即可产生您想要的效果。 从http://fontawesome.io/下载font-awesome 2.将fontawesome-webfont.ttf添加到您的项目。 3.确保已在要使用字体的目标中检查fontawesome-webfont.ttf文件的成员身份。 您可以通过在项目导航器中选择文件来执行此操作。 4.打开项目的Info.plist文件,然后添加项“您的应用程序中提供的字体”,并在其下添加.ttf文件的名称。 5.现在打开http://fontawesome.io/cheatsheet/并选择所需的“图标”,如下所示,然后按“ command + c”,即复制 6.现在,使用界面生成器打开xib。 假设我们在按钮上使用此图标,如下所示。 现在选择按钮,然后将复制的图标粘贴到“属性”检查器中显示的“ 标题”字段中。 之后,选择按钮的字体为“ FontAwesome”。 您也可以通过编程方式确定设置。

iOS面试问题第1部分:与众不同

iOS域非常庞大而深刻。 如果您正在寻找适合初学者或有经验的iOS开发面试问题,那么这里是正确的地方。 我已经准备了一些问题,并在各个部分进行了分叉,将一个故事组合在一起将无法证明该主题的合理性。 在这一部分中,我们将区分iOS中的许多已知术语。 我们遇到了许多看起来或听起来相似但略有不同或完全不同的术语。 这部分将主要关注iOS Core开发和Objective-C。 特定于Swift的术语将在单独的部分中进行讨论。 🙂 问:@合成VS @动态 @ synthesize将在编译时为您的属性生成getter和setter方法。 @dynamic只是告诉编译器,getter和setter方法不是由类本身实现的,而是由其他地方实现的(例如超类或将在运行时提供)。 @dynamic的用法例如与NSManagedObject (CoreData)的子类一起使用,或者当您要为由超类(未定义为插座)定义的属性创建插座时。 问:XIB VS NIB XIB(XML Interface Builder)是Xcode中的可执行代码。 它的大小比笔尖大。 这些是平面文件和XML文件 NIB(Nxt Interface Builder)是不可编辑且不可操作的文件。 它们的尺寸较小。 这些是二进制或存档文件。 编译后,XIB转换为NIB。 问:NSInteger VS Int VS NSNumber NSInteger是一种描述整数的类型定义,但它并不等效于64位平台上的int 。 在构建32位应用程序时将其定义为int ,对于64位应用程序则将其定义为int 。 大多数情况下,您可以使用NSInteger替换int,但这样做时需要考虑一些事项。 Int是原始数据类型。 NSNumber将数字类型存储为对象,并且可以转换为其他格式。 它还可以检索字符串表示形式。 问:任何VS任何对象 根据Apple的Swift文档: Any 可以代表任何类型的实例, 包括函数类型和可选类型。 AnyObject 可以代表任何 类类型 的实例 。 查看更多详细信息。 […]