iOS

Hire the Top 3% of 自由iOS开发者

Toptal是面向顶级iOS开发者的市场, engineers, programmers, coders, architects, and consultants. 顶级公司和初创公司可以聘请Toptal专职(全职), hourly, 或者兼职的iOS自由职业者,他们的关键任务软件项目.

无风险试用,满意才付款.

雇佣自由iOS开发者和工程师

Vladimir Mitrovic

Freelance iOS Developer

SerbiaToptal的自由iOS开发者 Since November 1, 2015

Vladimir已经做了11年的专业开发人员. 最近,他一直专注于增强现实、计算设计和计算机图形学. 他设计过复杂的软件系统,做过用户体验设计,领导过团队,还在会议上发表过演讲. 他重视简单和效率,喜欢开发互动产品,不管平台是什么.

Show More

Christina Lin

Freelance iOS Developer

CanadaToptal的自由iOS开发者 Since March 6, 2018

Christina是一名高级QA工程师,在测试自动化方面具有专业知识, test management, 以及对网络和移动应用程序的手动测试. 她在几个项目中使用Selenium WebDriver从头创建了测试自动化框架,并使用REST-assured和Postman自动化了API测试. 在私营和公共部门都有工作经验, 克里斯蒂娜曾与大型, medium-size, 小型创业公司.

Show More

Dan Napierski

Freelance iOS Developer

United StatesToptal的自由iOS开发者 Since April 28, 2016

Dan是一名专注于区块链技术应用的软件架构师和技术专家. 他拥有多年的专业咨询服务经验,为从初创公司到跨国公司的客户提供服务. 他擅长将严格的测试和防弹代码引入棘手的工程挑战. 他在人工智能的许多方面都有深厚的专业知识, blockchain, machine learning, and automation.

Show More

Muhammed Mutahr

Freelance iOS Developer

United StatesToptal的自由iOS开发者 Since June 9, 2018

Muhammad是一名高级软件工程师,在公共教育部门(WSU), 私营医疗保健公司(Meridian), 汽车行业的财富500强上市公司(通用汽车 & AAM). Throughout his career, 他用HTML/CSS设计网页应用, 使用JavaScript框架(Angular/Ionic)开发客户端应用, 并使用Java和c#开发健壮的服务器端应用程序.

Show More

Yoni Levy

Freelance iOS Developer

IsraelToptal的自由iOS开发者 Since December 10, 2019

Yoni在11岁时爱上了编程,现在他不知道如何停下来. 他的职业生涯是从c++开始的,从那以后,他的关注点转向了面向用户的软件. 在过去的十年里,他亲自参与了知名初创公司的所有工作. 他目前正在寻求帮助创建出色的iOS/macOS应用程序, 在App Store出现之前,他就有发行复杂iOS应用的经验.

Show More

Lorand Csatlos

Freelance iOS Developer

RomaniaToptal的自由iOS开发者 Since December 9, 2019

拥有超过十年的编程经验和超过八年的商业经验, Lorand知道与客户进行良好沟通和理解的重要性. 他痴迷于高品质和对细节的关注, 他努力寻找最好的解决方案. 他目前专注于在他的项目中使用Magento或TYPO3.

Show More

Bogdan Andrei-Teodor

Freelance iOS Developer

RomaniaToptal的自由iOS开发者 Since December 4, 2019

Bogdan是一名软件工程师,过去几年一直在游戏开发行业工作. 他的职业生涯开始于c++(前四年),然后转向Unity和c#(过去三年)。. Bogdan在企业和创业环境中都工作过,可以快速地将代码切换到其他语言(他有C语言的经验, Java, JavaScript, PHP, Python, and Bash/Batch).

Show More

Tommaso Resti

Freelance iOS Developer

ItalyToptal的自由iOS开发者 Since November 20, 2019

In 2005, 托马索的职业生涯始于软件工程师,然后在2011年跨入移动开发领域, 将两个世界连接在一起. 加入企业和敏捷方法将他的职业生涯推向了下一个阶段——tdd和干净的代码让他大吃一惊! Since 2015, Tommaso曾在专题小组工作过, 照顾每一个发展方面, 从后端到前端的持续交付流程.

Show More

Jakiša Tomić

Freelance iOS Developer

GermanyToptal的自由iOS开发者 Since November 13, 2019

Jakiša拥有超过15年的经验,为一系列操作系统开发各种类型的应用程序. 他的大部分技术专长是c++开发, 但他也很擅长使用JavaScript, C#, and Java. As for environments, 他知道使用Windows API的细节, embedded programming, 和分布式系统,并具有Linux/Unix系统的工作知识, macOS, 移动平台(Android和iOS).

Show More

Matthieu Achard

Freelance iOS Developer

Dominican RepublicToptal的自由iOS开发者 Since November 4, 2019

Matthieu是一名法国全栈开发人员,主要使用JavaScript、TypeScript和Node.js、React和React Native. 有很强的解决问题的能力和适应任何情况的能力, 自2015年以来,Matthieu一直在与国际团队远程合作, 为开发出色的解决方案做出贡献.

Show More

Ahmed Yosri

Freelance iOS Developer

RomaniaToptal的自由iOS开发者 Since October 30, 2019

自2012年以来,Ahmed一直是一名多面手游戏开发者. 他致力于游戏玩法, shaders, artificial intelligence, full-stack, 以及Gameloft等公司的表现, Forgotten Mines, and an Egyptian startup. 他喜欢开发,就像学习新技术和算法一样.

Show More

现在注册以查看更多资料.

Start Hiring
经常成对

获得额外的专业知识

我们的客户经常将这些额外服务与我们的自由iOS开发者配对.

A Hiring Guide

招聘优秀iOS开发者指南

真正的iOS专业知识远不止编码知识. 经验丰富的iOS开发者将对iOS平台有透彻的了解, its idiosyncrasies, 以及各种可用的实现选项的相对优点和缺陷. 本指南提供了一些有效的问题样本,以帮助评估候选人对iOS平台掌握的广度和深度.

Read Hiring Guide

iOS Hiring Resources

Trustpilot
THE TOPTAL ADVANTAGE

在无风险试用后,98%的Toptal客户选择雇用我们的人才.

Toptal的筛选和匹配过程确保卓越的人才与您的精确需求相匹配.

Start Hiring
Toptal in the press

... 允许公司快速组建具有特定项目所需技能的团队.

尽管对程序员的需求在不断增加,但Toptal对自己近乎常春藤联盟级别的审查感到自豪.

Our clients
为游戏制作应用程序
Conor Kenney
为游戏制作应用程序
构建一个跨平台的应用程序,在全球范围内使用
Thierry Jakicevic
构建一个跨平台的应用程序,在全球范围内使用
引领数字化转型
Elmar Platzer
引领数字化转型
挖掘实时数据将改变行业的游戏规则
挖掘实时数据将改变行业的游戏规则
What our clients think
Clients Rate Toptal iOS Developers4.4 / 5.0截至2023年12月23日,平均有1896条评论
Testimonials

没有Toptal就不会有Tripcents. Toptal Projects使我们能够与产品经理一起快速发展我们的基金会, lead developer, and senior designer. 在60多天的时间里,我们从概念到Alpha. 其速度、知识、专业知识和灵活性是首屈一指的. Toptal团队是tripcents的一部分,就像tripcents的任何内部团队成员一样. 他们像其他人一样贡献并拥有开发的所有权. 我们将继续使用Toptal. 作为一家初创公司,它们是我们的秘密武器.

Brantley Pace, CEO & Co-Founder

Tripcents

我对我们与Toptal的合作经验非常满意. 和我一起工作的专业人员在几个小时内就和我通了电话. 在和他讨论了我的项目后,我知道他就是我想要的候选人. 我立即雇用了他,他没有浪费时间就完成了我的项目, 甚至通过添加一些很棒的设计元素来增加我们的整体外观.

Paul Fenley, Director

K Dunn & Associates

与我合作的开发者都非常出色——聪明、有动力、反应灵敏. 过去很难找到高质量的工程师和顾问. Now it isn't.

Ryan Rockefeller, CEO

Radeeus

Toptal立即理解了我们的项目需求. 我们遇到了一位来自阿根廷的杰出自由职业者, from Day 1, 沉浸在我们的行业中, 与我们的团队无缝融合, understood our vision, 并产生了一流的结果. Toptal使与高级开发人员和程序员的联系变得非常容易.

Jason Kulik, Co-Founder

ProHatch

作为一家资源有限的小公司,我们不能犯代价高昂的错误. Toptal为我们提供了一位经验丰富的程序员,他能够立即投入工作并开始做出贡献. 这是一次很棒的经历,我们会马上再来一次.

斯图尔特·波克尼校长

现场专用软件解决方案

我们使用Toptal聘请了一位具有丰富的Amazon Web Services经验的开发人员. 我们面试了四位候选人,其中一位非常符合我们的要求. 这个过程迅速而有效.

Abner Guzmán Rivera,首席技术官和首席科学家

Photo Kharma

Sergio是一个很棒的开发者. 一流,反应迅速,工作效率高.

Dennis Baldwin,首席技术专家和联合创始人

PriceBlink

和Marcin一起工作是一种乐趣. He is competent, professional, flexible, 并且非常迅速地理解需要什么以及如何实现它.

André Fischer, CTO

POSTIFY

我们需要一位能立即开始我们项目的专业工程师. 西马纳斯的工作超出了我们的预期. 不需要采访和追踪专家开发人员是一种非常节省时间的方法,并且让每个人都对我们选择切换平台以使用更健壮的语言感到更舒服. Toptal使这一过程变得简单方便. Toptal现在是我们寻求专家级帮助的首选之地.

Derek Minor, Web开发高级副总裁

Networld Media Group

Toptal的开发人员和架构师都非常专业,也很容易共事. 他们提供的解决方案价格合理,质量上乘,缩短了我们的发行时间. Thanks again, Toptal.

Jeremy Wessels, CEO

Kognosi

我们与Toptal合作非常愉快. 他们为我们的应用程序找到了完美的开发人员,让整个过程变得非常简单. 它也很容易超出最初的时间框架, 我们可以在整个项目中保持同一个承包商. 我们强烈推荐Toptal,因为它可以快速无缝地找到高素质的人才.

Ryan Morrissey, CTO

应用商业技术有限责任公司

我对Toptal印象深刻. 我们的开发人员每天都和我交流,他是一个非常强大的程序员. 他是一个真正的专业人士,他的工作非常出色. 5 stars for Toptal.

Pietro Casoar, CEO

Ronin Play Pty Ltd

与Toptal合作是一次很棒的经历. Prior to using them, 我花了相当多的时间面试其他自由职业者,但没有找到我需要的. 在与Toptal合作后,他们在几天内就为我找到了合适的开发者. 与我一起工作的开发人员不仅提供高质量的代码, 但他也提出了一些我没有想到的建议. 我很清楚,阿莫里知道自己在做什么. Highly recommended!

George Cheng, CEO

Bulavard, Inc.

作为一名Toptal合格的前端开发人员,我还经营着自己的咨询业务. 当客户来找我帮忙填补他们团队中的关键角色时, Toptal是我唯一愿意推荐的地方. Toptal的所有候选人都是精英中的精英. Toptal是我在近5年的专业在线工作中发现的性价比最高的网站.

Ethan Brooks, CTO

Langlotz Patent & Trademark Works, Inc.

In Higgle's early days, 我们需要一流的开发者, at affordable rates, in a timely fashion. Toptal delivered!

Lara Aldag, CEO

Higgle

Toptal能让你轻松找到合适的人选,让你放心,因为他们有能力. 我肯定会向任何寻找高技能开发人员的人推荐他们的服务.

Michael Gluckman,数据经理

Mxit

Toptal将我们的项目与最优秀的开发人员快速匹配的能力非常出色. 开发人员已经成为我们团队的一部分, 我对他们每个人所表现出的敬业精神感到惊讶. 对于那些希望与最好的工程师远程工作的人来说,没有比Toptal更好的了.

Laurent Alis, Founder

Livepress

Toptal让寻找合格的工程师变得轻而易举. 我们需要一个有经验的ASP.. NET MVC架构来指导我们的启动应用程序的开发, Toptal在不到一周的时间里为我们找到了三位优秀的候选人. 在做出我们的选择后,工程师立即在线并开始工作. 这比我们自己发现和审查候选人要快得多,也容易得多.

Jeff Kelly, Co-Founder

Concerted Solutions

我们需要一些Scala的短期工作,Toptal在24小时内为我们找到了一位优秀的开发人员. 这在其他平台上是不可能实现的.

Franco Arda, Co-Founder

WhatAdsWork.com

Toptal为快速发展和规模化的企业提供不妥协的解决方案. 我们通过Toptal签约的每一位工程师都迅速融入了我们的团队,并在保持惊人的开发速度的同时,将他们的工作保持在最高的质量标准.

Greg Kimball,联合创始人

nifti.com

如何通过Toptal招聘iOS开发者

1

与我们的行业专家交谈

Toptal的工程总监将与您一起了解您的目标, technical needs, and team dynamics.
2

与精心挑选的人才一起工作

几天之内,我们将为你的项目介绍合适的iOS开发者. 平均匹配时间在24小时以下.
3

绝对合适

与新iOS开发者合作一段时间(如果满意才付费), 在订婚前确保他们是合适的人选.

寻找拥有相关技能的专家

在我们的人才网络中访问大量熟练的开发人员,并在48小时内雇用最优秀的3%.

FAQs

  • Toptal的iOS开发者有何不同?

    At Toptal, 我们会对iOS开发者进行全面筛选,确保为你提供最优秀的人才. Of the more than 200,每年有5000人申请加入Toptal网络, 只有不到3%的人能达标. 你将与工程专家(而不是一般的招聘人员或人力资源代表)一起了解你的目标, technical needs, and team dynamics. 最终的结果是:经过专家审查的人才从我们的网络,定制匹配,以满足您的业务需求.

  • 我能否在48小时内通过Toptal雇佣iOS开发者?

    取决于可用性和进度, 你可以在注册后48小时内开始与iOS开发者合作.

  • Toptal iOS开发者的无风险试用期是多长?

    我们确保你和你的iOS开发者之间的每一次合作都有长达两周的试用期. 这意味着你有时间确认订婚是否成功. 如果你对结果完全满意, 我们会给你开时间单的,你愿意多久我们就多久. 如果您不完全满意,我们不会向您收费. From there, we can either part ways, 或者我们可以为您提供另一位可能更合适的专家,我们将与他开始第二轮谈判, no-risk trial.

Share
iOS

如何聘请优秀的iOS开发者

自2008年iPhone推出第三方开发功能以来,iOS应用开发者的数量显著增长. 目前,App Store上有超过100万款iOS手机应用可供下载, 由不断扩大的全球开发人员社区提供.

对于那些想要雇佣一名专门的iOS开发者的人, 这种新出现的人气既是一种祝福,也是一种诅咒. 虽然它使iOS程序员比以往任何时候都更容易找到, 这也使得从众多候选人中挑选出真正的iPhone应用开发专家变得更加困难.

部分挑战在于,真正的专业知识远远超出了编码知识. 它需要了解实现解决方案所存在的各种选项, 以及这些不同的选择在生产力方面带来的权衡, scalability, performance, and maintainability.

With that in mind, 本文提供了一些问题样本,可以用来评估候选人整体iOS专业知识的深度和广度.

With regard to coding, 本招聘指南试图尽可能不涉及语言, 同时也满足了大多数iOS和iPhone开发者社区的需求.e., 那些用Objective-C编写iOS应用程序的人,或者那些正处于采用Swift和Cocoa Touch不同阶段的人). 然而,重要的是要认识到iOS应用程序也可以用Ruby, Python, c# /编写.NET, Lua, Pascal, 甚至使用抽象库,让你用web技术编写iOS应用程序. That said, 因为iOS开发框架基本上是用Objective-C编写的, 做iOS开发需要一些Objective-C概念的基本知识,因此在本指南中进行讨论.

需要注意的是:这些示例问题只是作为一个指南. 并不是每一个值得雇佣的“A”候选人都能正确回答所有问题, 回答所有问题也不能保证成为A级考生. Rather, 这些问题是有效招聘过程的重要组成部分, 正如我们在帖子中所描述的 寻找少数精英. 说到底,招聘既是一门科学,也是一门艺术.

评估基金会

有一些iOS编程的基础知识(尤其是Objective-C)是求职者应该熟悉的. Here are some examples.

问:描述一下Objective-C中方法和消息的使用. 讨论这种方法的一些优点和缺点.

Objective-C中的方法与类相关联. Objective-C有实例方法需要(用面向对象的说法)一个类的实例, 类方法可以用一个类调用(类似于Java中的静态方法的概念), for example).

方法通过向它们发送消息来调用. 这里有一个发送消息给a的例子 myUser object:

[myUser allowAuthorizationTo: secretChamber forDuration: oneHour]

在Objective-C中,不像许多其他语言(包括Swift)!), 我们可以将消息发送给null对象而不会产生负面影响(消息被忽略并继续执行)。.

在Cocoa工具链的早期版本中,您还可以调用编译器使用的方法, at compile time, 无法确定的存在. 虽然这听起来像是一个强大的功能, 它更常见的是一个恼人的调试场景的来源.

这里需要注意的是,除了用“奇怪的”方括号发送消息外, to the uninformed eye, Objective-C appears 有一个外部参数名称的概念(一个从Swift借来的术语),但事实并非如此. 在上面的例子中,方法被调用 must have forDuration: 加上一个伴随的参数 must 在方法调用中处于相同的位置.

(有关参数名在Objective-C中如何工作的更多信息,请参阅此 blog entry 比尔·布姆加纳(Bill Bumgarner)对此的回应 post on PyObjC by Toptal’s Ryan Wilcox.)

问:什么是选择器,它的目的是什么? 提供一个示例,说明在哪里以及如何使用它.

A selector 该机制是否用于为对象选择要执行的方法, 或在编译源代码时替换名称的唯一标识符. 选择器的作用就像一个动态函数指针,指向类方法的实现.

例如,假设您有一个方法的选择器 run, and three classes (Dog, Athlete, and ComputerSimulation),每个实现一个方法 run. 选择器可以与每个类的实例一起使用,以调用其run方法, 尽管每种方法的实现可能非常不同.

问:如何在运行时动态检查一个类是否支持一个可以响应特定消息的方法?

The respondsToSelector: 方法返回一个布尔值,该值指示接收者是否实现或继承可以响应指定消息的方法.

在运行时动态检查类是否支持某个方法的能力对于委托(请参阅本指南中的下一个问题)特别有用,委托可以具有开发人员可以选择实现或不实现的可选方法. 一个常见的模式是使用 respondsToSelector: 查看委托对象在发送消息之前是否实现了可选方法. For example:

if [self.myDelegate respondsToSelector: @selector(allowAuthorizationTo:forDuration:)] {
    [self.myDelegate allowAuthorizationTo: theVault forDuration: oneHour]
}

As noted in 苹果的iOS文档但是,您不能测试对象是否 inherits 一个方法(来自它的父类) respondsToSelector: to the object using the super keyword. Sending respondsToSelector: to super 等于把它发送到 self. 相反,你应该使用 instancesRespondToSelector: 方法,例如:

如果([MySuperclass instancesRespondToSelector:@selector(aMethod)]) {
    //调用继承的方法
    [super aMethod];
}

问:委托模式是什么?它的用途是什么? 描述a使用的委托 UITableView.

委托是指一个对象依赖于另一个对象来提供一些定义良好的功能, state information, data, or events. As stated in 苹果的Cocoa开发者指南, 委托的主要价值在于它允许你在一个中心对象中轻松地定制多个对象的行为。.

授权的一个很好的例子是 UITableView 对象,该对象通常在屏幕上呈现表时使用. The UITableView 使用两个不同的委托:

  1. UITableViewDelegate:如果用户有,则调用, for example, selected a cell, 或者确定一行的高应该是多少.
  2. UITableDataSource:用于检索与如何呈现表中的每个单元格有关的信息, how many rows there are, 如果行可以编辑或移动, and so on.

问:Objective-C中的类别是什么?它们与子类有什么不同?

类别是扩展现有类的一种方式,是使用子类的另一种选择. 子类化和类别之间的主要区别在于,类别向现有类本身添加功能,然后在使用该类或其子类的代码中的任何地方都可以使用该功能. 相反,子类化会创建一个具有添加(或修改)功能的新类. 然后必须使用这个新的子类, 而不是原始类或它的任何子类, 来访问此扩展或修订的功能.

For example, Objective-C中常见的字符串对象是NSString它有一个可变子类NSMutableString. 当你使用类别来扩展NSString类, 你代码中的每个NSString和NSMutableString对象都会支持这些新方法. 这些新方法可以在任何导入类别头文件的类中的任何NSString或NSMutableString上被调用.

然而,类别的一个潜在陷阱是名称冲突. 如果实现与引用类中的现有方法同名的类别方法, 运行时的行为是未定义的(i.e.,无法预测将调用哪个版本的方法)。. 为了避免名称冲突,Apple建议在任何类别方法之前使用三个字母的前缀.

类别的另一个限制是它不能为类定义新的实例变量. However, 有经验的开发人员会意识到,可以使用Objective-C运行时方法定义与类关联的新状态对象, 哪个为类别提供了一种存储状态更改的方法.

问:描述一下Cocoa中的错误处理.

大多数错误在Cocoa中通过 NSError. 两种比较常见的方法如下:

  1. Pass a blank NSError 对象转换为方法和, 当方法完成时, 检查该对象是否仍然为空或包含错误. (更精确地说,传递一个指向 NSError pointer, or NSError ** in Objective-C parlance.)

  2. 将一个NSError对象传递给某个失败委托方法或回调.

NSError 对象具有错误域、错误代码和用于附加信息的用户信息字典. 这些附加信息可能包括, for example, 本地化的描述和恢复建议, 之后的代码可以把它显示给用户.

In addition to NSErroriOS开发也是如此 NSException. 与其他语言中的异常不同, NSException 仅用于编程错误. Cocoa框架通常不是异常安全的, 因此,如果您生成(或调用生成)异常的代码, 在使用try/catch时应尽可能靠近发生异常的地方. In practice, NSException 在iOS代码库中很少使用.

问:常见的原因是什么 exc_bad_access 错误以及如何调试它们?

exc_bad_access 由于缺乏有用的调试信息,错误是经常发生的,会让新手iOS开发者感到沮丧. 当试图访问从未初始化或已经释放的对象时,通常会发生这种情况. 这些错误也可能是由于向消息传递了一个不打算接收的参数而导致的.g., passing in an NSInteger when an NSString is expected).

请注意,在某些情况下,编译器将提供 warning that, if heeded, 是否可以提醒开发人员注意问题,以便在发生任何运行时错误之前解决问题. 但如果忽视这些警告, exc_bad_access errors may occur. Here, for example, 试图使用整数变量格式化字符串的错误代码:

[NSString stringWithFormat:@"This is %@", 123];

The %@ 在字符串格式规范中表示一个对象, rather than an integer, 是预期的(整数将用 %d). 因此,该语句将导致编译器警告,如果忽略它,将导致 exc_bad_access error at runtime.

But not all causes of exc_bad_access 错误将被编译器识别.

A common cause of exc_bad_access 编译器无法检测到的错误正在试图访问已释放的对象. In such cases, enabling NSZombies 在Xcode中是一种有效的调试技术. Enabling NSZombies 使通常会被释放的对象以“僵尸”的形式存活。. After enabling NSZombies, 然后,您可以跟踪代码中发生的情况,并在应用程序试图访问已释放的对象时接收一条消息, 从而识别代码中的问题. 但要注意的是:一定要记住 disable NSZombies 在将应用提交到app Store之前. When NSZombies is enabled, 没有对象被释放,你将不断地泄漏内存,直到你的应用程序最终由于内存警告而被杀死.

Digging Deeper

如前所述,真正的iOS专业知识远不止编码知识. 经验丰富的iPhone应用开发者会对iOS平台的“底层”有透彻的了解. 他们也将很清楚现有的各种执行办法, 包括这些不同的选择在生产力方面带来的权衡, scalability, performance, and maintainability. 接下来的问题有助于评估候选人在这方面的专业知识.

问:在Objective-C中比较和对比MRR和ARC的内存管理方法.

object - c通过使用a来跟踪哪些对象正在使用或未使用 retain count. When an object is in use by another object it’s retain count goes up; when it is not being used by any objects, 它的保留计数恢复为零.

在Objective-C中,有两种方法来管理这个保留计数:

  1. 手动保持-释放(MRR)
  2. 自动参考计数(ARC)

With MRR, 开发人员不得不担心自动释放对象, 或者在某些情况下将其放入自动释放池.

In contrast, ARC 自动处理这些问题. 因此,大多数iOS应用和开发者都转向了ARC. 事实上,在Swift中,ARC是必需的.

虽然ARC确实需要一些思考(例如对象所有权),但对于开发人员来说,MRR的要求要少得多.

问:在绘制和制作带有阴影的视图动画时,如何提高性能?

如果你需要给视图添加阴影, many inexperienced developers will import the QuartzCore framework and apply a shadow to the layer property of the view; e.g.:

UIView * shadowview = [[UIView alloc] init];
 
shadowedView.layer.shadowOffset = CGSizeMake(1.0, 1.0);
shadowedView.layer.shadowRadius = 2.0;
shadowedView.layer.shadowOpacity = 0.9;

虽然这是一个简单的方法来添加一个稍微透明的阴影的视图, 这可能导致较差的渲染性能. Unfortunately, 渲染引擎通常需要检查视图的每个像素来确定阴影的轮廓.

但是,您可以定义 shadow path 为了避免这种昂贵的计算和优化渲染. 对于一个标准的矩形视图,你可以将阴影路径定义为:

shadowedView.layer.shadowPath = [[UIBezierPath bezierPathWithRect].bounds] CGPath];

这提供了更好的性能, 不过你必须记住,当视图的边界改变时, 阴影路径也需要更新.

By default, 当用阴影动画视图时, 阴影在动画的每个阶段被重新绘制. 你可以用阴影来优化动画 rasterizing 带阴影的视图层. 当有阴影的图层被栅格化, 它在其局部坐标空间中呈现为位图,然后合成到目的地. 下面是一个如何栅格化阴影效果的例子:

shadowedView.layer.shouldRasterize = YES;
//我们需要确保它对屏幕的像素密度进行光栅化
shadowedView.layer.rasterizationScale =[屏幕主屏幕].scale;

问:导致滚动表视图性能差的常见原因是什么? How can they be avoided?

当iPhone刚问世的时候, 流畅的滚动是积极用户体验的关键之一. However, 新手开发人员可能会犯许多错误,导致滚动时出现延迟. Examples include:

  • 没有正确使用重用标识符. 滚动表格时的默认行为是释放屏幕外的表格单元格,并为显示的新内容创建新单元格. 当您使用重用标识符时, 当单元格离开屏幕时,它不会被释放,而是被缓存以供重用. 如果要出现具有相同重用标识符的新单元格, 使用缓存的单元,并且避免了分配和布局一个全新单元的昂贵操作. 相反,缓存单元格必须重新配置以显示新内容, 例如更新显示的文本和图像.

  • 同步加载网页内容. 如果加载是同步完成的, 当数据加载时,它会使主线程停止运行, 在滚动时,哪个会导致明显的延迟. 当下载图像以在表格单元格中显示时,这是一个特别常见的问题. 这里的解决方案是使用占位符值或图像,并在后台异步加载数据. Once the data is loaded, 然后可以向主线程发送消息以更新相应的单元格.

  • 在设置要显示的单元格时应用昂贵的操作. Expensive operations, 例如将高分辨率图像转换为缩略图,或对图像应用复杂的照片滤镜或转换, 是否会严重降低显示性能. 如果您只需要缩略图大小的图像,请在本地存储较小的图像. 同样,如果可能的话,提前对图像应用任何复杂的变换. Alternatively, 在主线程外对图像执行必要的操作,然后在图像准备显示时刷新单元格.

  • 过于复杂的视图层次结构. 虽然你可以使用各种uiview来创建自定义单元格, 如果过度使用或过于复杂,这可能会降低性能. 尽管随着支持iOS设备的速度越来越快,这已经不再是一个问题, 在某些设备和场景中,它仍然会影响滚动性能. Although tedious, 这个问题可以通过实现您自己绘制单元格的内容来解决.e.,替换uilabel, UIImages等.,用一个UIView,然后在那个视图中实现你自己的绘图). 如果操作得当,可以显著提高渲染单元格时的性能.

问:图解核心数据栈.

Core Data 苹果的模型层、持久对象存储和对象图管理器. 您可能会想调用Core Data Apple的对象关系映射器, 但它真的不止于此.

下面是核心数据栈的示意图.

Note: 很少有开发者能够从内存中映射出整个核心数据栈. Core Data中更重要/更频繁使用的部分是下图中橙色突出显示的部分.

问:Core Data线程安全吗? 如何在应用中处理这个问题?

Core Data is not thread safe. 因此,Apple推荐的方法是使用线程包含,这需要创建一个单独管理的对象上下文来访问每个线程上的Core Data对象,并拥有一个共享的持久存储协调器. 如果您需要更大的并发性, 您还可以拥有单独的持久存储协调器, 尽管这带来了额外的复杂性和内存使用的增加.

在iOS 5之前,开发者需要手动管理线程. However, the release of iOS 5 added new methods to the managed object context to eliminate the need for manual thread management; instead you can safely access Core Data objects through a block of code passed to the performBlock: or performBlockAndWait: methods.

Keep in mind, though, 对核心数据对象的更改不一定会立即传播到其他线程. In the standard case, 加载到内存中的核心数据对象不会在不同的线程上更新,直到这些对象再次从持久存储中取出. 为了使托管对象上下文能够立即接收来自另一个线程上的核心数据对象的更改, 它需要观察 NSManagedObjectContextDidSaveNotification. 发生此通知后,对象可以使用 mergeChangesFromContextDidSaveNotification: method.

问:请描述一下在iOS平台上实现并发的不同方法.

iOS平台提供了以下机制来实现并发:

  • NSThread. Cocoa通过子类化提供了创建线程和执行代码的支持 NSThread.
  • NSOperationQueue. NSOperationQueue 是一个简单的API,它决定有多少东西可以同时运行,然后去做它们. 它允许您限制并发运行的操作的数量.g.,以限制并发下载的数量). 虽然简单而有用,但它是一个超越手动管理的抽象层 NSThread 以及可能涉及的并发症. (It’s often sadly unused.)
  • 中央调度(GCD). GCD是Apple提供低级并发访问的方法. GCD有很多,但有时你真的想要一个低级工具. GCD包括一些有用的工具,特别是以下工具:
    • dispatch_async当给定一个任务(代码块)时,它将在将来的某个时候运行它.
    • dispatch_group_async:您可以使用。创建一组分派任务 dispatch_group_create() and dispatch_group_async(). 您甚至可以等待队列中的所有任务完成 dispatch_group_wait().

Bonus Section: Swift

Swift 是苹果公司推出的一种新的编程语言,被称为“没有C的Objective-C”。. Swift可以与Objective-C并行工作, 提供许多改进,使开发人员能够在更短的时间内创建更稳定、性能更好的应用程序. 总的来说,这是自iOS SDK首次发布以来iOS开发的最大变化. 2014年在苹果的WWDC上发布, 并在2014年9月发布iOS 8后投入生产使用, Swift还将兼容iOS 7和OS X Mavericks.

Apple框架在Swift中也以同样的方式使用, 所以一个有经验的iOS开发人员能够将他或她的大部分知识转移到编写Swift代码上. That said, 关于Swift及其与Objective-C的互操作性,有几个问题是有经验的iOS开发者应该知道的.

问:在同一个项目中,Swift和Objective-C代码如何一起使用? 在这方面有哪些限制? Provide an example.

两种语言都可以在同一个项目中使用, 这要归功于Xcode在两种语言之间自动创建的桥接头文件.

在初始化普通表视图时可以看到一个这样的例子.

在Objective-C语法中,这将被指定为:

UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; 

相比之下,Swift桥去掉了 initWith 语法,并自动修改格式为Swift语法,如下所示:

let tableView: UITableView = UITableView(frame: CGRectZero, style: .Plain)

Fortunately, Swift能够利用任何用Objective-C编写的东西, 所以你可以创建一个新的Swift项目,并且仍然使用任何现有的代码库.

However, 这种桥接只能在Objective-C到Swift中完美地工作(反之亦然)。, 因此,利用Swift新特性的代码将无法在Objective-C文件中访问. 这方面的例子包括泛型, tuples, 和Swift中定义的结构, 这在Objective-C中是没有对应的. Unfortunately, 这可能会使一些令人兴奋的第三方库难以或无法利用,这些库正在Swift中使用现有的Objective-C代码库构建.

Apple provides detailed documentation 如何在Objective-C中使用Swift, 每个有经验的开发人员都应该熟悉哪些内容.

Q:比较Objective-C和Swift中的方法调用和消息. Provide an example.

而Objective-C使用独特的括号语法来调用对象上的方法, Swift使用更传统的点符号.

So, a message like [myUser allowAuthorizationTo: secretChamber forDuration: oneHour] 在Objective-C中变成 myUser.allowAuthorizationTo(secretChamber, forDuration: oneHour) in Swift.

问:比较Objective-C和Swift的错误处理.

编写与Objective-C交互的Swift代码意味着处理 NSError 就像Objective-C一样. 然而,在Swift中,异常不再被支持.

使用一个接受 NSError 意味着使用一个可选变量(一个可能存在也可能不存在的变量),如果它存在,则展开错误.

Swift是一种新的编程语言, 关于错误处理的最佳实践, 特别是Swift代码调用其他Swift代码, 在写这篇文章时(2014年9月)还没有真正出现。.

Wrap-up

随着一种全新的编程语言(Swift)的发布,iOS应用开发领域正在发生巨变。, 找到精通应用开发平台并能在这两种语言之间转换的iPad和iPhone应用开发者变得比以往任何时候都更加重要. 为你的开发团队找到这些全职或兼职的专家总是一个挑战,没有一个简短的指南可以完全涵盖这个主题, 我们希望这篇文章中的问题能够提供一个起点,帮助你识别那些精通手机应用开发环境的开发者.

顶级iOS开发者需求量大.

Start Hiring