iOS.

雇用 Top 3%自由IOS开发人员

Toptal.是顶级IOS开发人员,工程师,程序员,编码器,建筑师和顾问的市场。顶级公司和初创企业为其使命关键的软件项目选择Toptal IOS自由职业者。

无风险审判,仅在满意时付款。

客户率 Toptal. iOS Developers4.3 / 5.0平均截至3月13日,2021年3月13日

通过领先的品牌和初创公司信任

聘请自由职业者iOS开发人员和工程师

弗拉基米尔米特罗维奇

自由IOS开发人员

塞尔维亚自从2015年9月23日以来Toptal的自由IOS开发商

弗拉基米尔是一家专业开发商,有11年。最近,他'S一直专注于增强现实,计算设计和计算机图形学。他拥有架构复杂的软件系统,完成了UX设计,LED团队,并在会议上发言。无论平台,他都会重视简单和效率,并喜欢互动产品的工作。

展示更多

克里斯蒂娜林

自由IOS开发人员

加拿大自2016年1月19日起在Toptal的自由IOS开发商

Christina是一名高级QA工程师,具有测试自动化,测试管理和Web和移动应用程序的手动测试的专业知识。她在几个项目中使用Selenium WebDriver创建了从头开始测试自动化框架以及使用休息和邮递员自动化API测试。 Christina拥有私人和公共部门的经验,拥有大型,中型和小型创业公司。

展示更多

丹纳帕尔斯基

自由IOS开发人员

美国自2015年12月20日以来Toptal的自由IOS开发人员

丹是一种软件架构师和技术专业专业专注于区块链技术的应用。他拥有多年的经验,为客户提供专业的咨询服务,从初创公司到全球公司。他专门为艰难的工程挑战带来严格的测试和防弹码。他在人工智能,区块链,机器学习和自动化的许多方面都有深刻的专业知识。

展示更多

Muhammed MutaHr.

自由IOS开发人员

美国自2018年3月2日起在Toptal的自由IOS开发人员

Muhammad是一名高级软件工程师,拥有几年的行业经验,包括来自公共教育部门(WSU),私营的医疗保健公司(经络)和汽车行业的公共财富500强公司(GM&aam)。在他的职业生涯中,他在HTML / CSS中设计了Web应用程序,使用JavaScript Frameworks(Aganular / Ionic)开发的客户端应用程序,并使用Java和C#以开发强大的服务器端应用程序。

展示更多

yoni levy

自由IOS开发人员

以色列自从2019年11月2日起在Toptal的自由IOS开发人员

Yoni在11岁时爱上了编程,现在他没有'知道如何停止。他开始使用C ++的职业生涯,并从他们的焦点转移到更多面向用户的软件。在过去的十年中,他在高调的初版开始时堆叠的所有部分。他'S目前希望帮助创建卓越的IOS / MacOS应用程序,并在App Store存在之前运输复杂的iOS应用程序。

展示更多

Lorand Csatlos.

自由IOS开发人员

罗马尼亚自2017年5月29日起在Toptal的自由IOS开发人员

随着十多年的编程经验和6年以上的企业所有者,Lorand知道与客户的沟通和理解的重要性。他'S痴迷于高品质和对细节的关注,他努力找到最好的解决方案。他目前专注于在他的项目中使用Magento或Typo3。

展示更多

Bogdan Andrei-Teodor

自由IOS开发人员

罗马尼亚自2019年8月5日起以自2019年8月5日起自由职业者iOS开发商

波格丹是一名软件工程师,在过去几年中在游戏开发行业工作。在转向Unity和C#之前,他在C ++(前四年)开始了他的职业生涯。 Bogdan在公司和启动环境中工作,可以快速将他的代码切换到其他语言(他有C,Java,JavaScript,PHP,Python和Bash / Batch的经验。

展示更多

Tommaso Resti

自由IOS开发人员

西班牙自从2016年4月11日起以来Toptal的自由IOS开发商

2005年,Tommaso开始作为一个软件工程师的职业生涯,然后在2011年迈出了移动发展,这将两个世界与他联系起来。加入企业和敏捷方法将他的职业生涯推向下一个级别的TDD和清洁代码吹嘘他的想法!自2015年以来,Tommaso已在特征队伍中工作,从后端到前端到连续交付过程,照顾每个发展方面。

展示更多

jakisa tomic

自由IOS开发人员

德国自2019年10月2日以来Toptal的自由IOS开发人员

Jakisa拥有超过15年的经验,开发各种类型的应用程序,适用于一系列操作系统。他的大部分技术专长都在C ++开发中,但他也很乐于使用JavaScript,C#和Java。至于环境,他知道与Windows API,嵌入式编程和分布式系统一起使用的INS和外,并具有Linux / UNIX系统,麦克斯和移动平台的工作知识(Android和iOS)。

展示更多

Matthieu Achard.

自由IOS开发人员

越南自从2019年2月25日起在Toptal的自由职业者IOS开发人员

Matthieu是一个法国全堆栈JavaScript开发人员,为各种初创公司发货了许多最低可行的产品(MVPS)。其中一个MVPS-StreamRoot-于2019年出售给Centurylink。除了他深入的技术诀窍外,Matthieu还在拥有基于世界各地的远程队友的自由队员上成功地合作,包括日本,美国和美国和英国。

展示更多

艾哈迈德yosri.

自由IOS开发人员

罗马尼亚自从2019年3月11日起在Toptal的自由职业者IOS开发者

自2012年以来,艾哈迈德是一般的游戏开发人员。他在游戏机,着色器,人工智能,全筹码和Gameloft,被遗忘的矿山等公司工作进行了工作。他喜欢发展新技术和算法。

展示更多

立即注册以查看更多档案。

开始招聘

招聘指南

聘请伟大的iOS开发人员指南

真正的iOS专业知识远远超出编码知识。高度经验丰富的iOS开发人员将彻底了解IOS平台,其特质,以及可用各种实现选项的相对优点和陷阱。本指南提供有效问题的采样,以帮助评估候选人的广度和深度'S掌握iOS平台。

阅读招聘指南

iOS.招聘资源

更多资源来雇用iOS开发人员

职位描述模板

面试问题

常见的错误

职位

TrustPilot.
Toptal. in the press

...允许公司快速组装具有特定项目的合适技能的团队。

尽管对编码人员的需求加速了,Toptaltal旨在自行为几乎常春藤联盟级审查。

我们的客户
构建一个全球使用的跨平台应用程序
Thierry Jakicevic.
构建一个全球使用的跨平台应用程序
1
2
3
为游戏创建一个应用程序
Conor Kenney.
为游戏创建一个应用程序
1
2
3
领导数字转型
Elmar Platzer.
领导数字转型
1
2
3
推荐书

三普国不会'T存在没有顶尖。顶部项目使我们能够用产品经理,铅开发商和高级设计师迅速发展我们的基础。在60多天内,我们从概念到阿尔法。速度,知识,专业知识和灵活性是秒数。 Toptaltal团队作为三级队员的三级队员的一部分。他们贡献并就像其他人一样贡献并获得了发展的所有权。我们将继续使用TOPTAL。作为一个启动,他们是我们的秘密武器。

布兰特利步长,首席执行官& Co-Founder

三级

我对Toptaltal的经验非常满意。我必须与我一起工作的专业人士在几个小时内与我一起。我知道在与他讨论我的项目后,他是我想要的候选人。我立即雇了他,他浪费了浪费时间来到我的项目,甚至通过添加一些优秀的设计元素来加强额外的英里,以增强我们的整体外观。

Paul Fenley,导演

k dunn.& Associates

我与令人难以置信的 - 聪明,驱动和响应性的开发人员。它曾经很难找到优质的工程师和顾问。现在它是't.

Ryan Rockefeller,CEO

辐射群

Toptal.立即了解我们的项目。我们与阿根廷的特殊自由职业者与阿根廷,从第1天沉浸在我们的行业中,与我们的团队无缝混合,理解我们的愿景,并产生了顶级缺口结果。 Toptal与卓越的开发人员和程序员相连,非常容易。

Jason Kulik,联合创始人

PROHATCH.

作为一个有限资源的小公司,我们可以'不起赚得昂贵的错误。 Toptal为我们提供了一个经验丰富的程序员,他们能够击中地面运行并立即开始贡献。这是一个伟大的经历和我们'd再次在心跳中重复。

斯图尔特Pocknee,校长

站点特定的软件解决方案

我们使用Toptal聘请开发人员,具有广泛的亚马逊网络服务体验。我们采访了四名候选人,其中一个候选人竟然有适合我们的要求。该过程快速有效。

ABNERGUZMÁNVILLA,CTO和首席科学家

照片kharma.

Sergio是一个令人敬畏的开发人员。顶级陷波,响应,并有效地完成了工作。

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

PriceBlink.

与马林一起工作是一种快乐。他是有能力,专业,灵活的,非常快速地了解所需的内容以及如何实现它。

andréFischer,CTO

发布

我们需要一个专家工程师,他们可以立即启动我们的项目。辛巴纳斯与他的工作超出了我们的期望。不得不采访和追逐专家开发商是一个优秀的时光,让每个人都对我们的选择感到更加舒适,以改变平台来利用更强大的语言。 Toptog易于方便地制作了该过程。 Toptal现在是我们寻找专家级别帮助的第一名。

网页开发的高级VP德里克未成年人

NetWorld Media Group.

Toptal.'S开发人员和建筑师都非常专业,易于使用。他们生产的解决方案相当定价和最高品质,减少了推出的时间。再次感谢,Toptal。

Jeremy Wessels,CEO

Kognosi.

我们拥有Toptal的伟大体验。他们将我们与完美的开发人员配对,为我们的应用程序并使过程非常容易。它也很容易超出初始时间范围,我们能够在我们的项目中保持相同的承包商。我们绝对推荐顶尖,用于快速和无缝地找到高质量的人才。

Ryan Morrissey,CTO

应用业务技术,LLC

I'M Toptal令人难以置信地印象深刻。我们的开发人员每天与我沟通,是一个非常强大的编码器。他'真正的专业人士,他的工作很棒。顶部5星。

Pietro Casoar,CEO

Ronin Play Pty Ltd

与Toptal一起工作是一个很好的体验。在使用它们之前,我花了很长时间采访其他自由职业者和尚未'找到我需要的东西。与Toptal一起参与后,他们在几天内与完美的开发人员匹配。开发商I.'m不仅可以提供质量代码,而且他还提出了我达到的事情的建议't thought of. It'对我来说清楚,阿拉夫里知道他在做什么。强烈推荐!

乔治城,首席执行官

Buravard,Inc。

作为顶级合格的前端开发人员,我也运营了自己的咨询练习。当客户来找我来帮助填补他们的团队上的关键角色时,Toptal是我唯一舒适的推荐的地方。 Toptal.'整个候选池是最好的。 Toptal是我的最佳价值我'在近一年的专业在线工作中发现了。

Ethan Brooks,CTO

Langlotz专利&商标作品,Inc。

在嘻嘻哈哈'早期,我们以及时的方式,我们需要一流的开发商,以实惠的价格。 Toptal送货!

Lara Aldag,CEO

h

Toptal.让候选人非常容易,让您能使他们有能使他们有能力提供。我肯定会向寻求高技能开发人员的人推荐他们的服务。

Michael Gluckman,数据经理

mxit.

Toptal.迅速匹配我们的项目与最佳开发人员的能力只是一流的。开发商已成为我们团队的一部分,我对他们中的每一个都证明了专业承诺的水平。对于那些希望远程工作的人与最好的工程师来说,看起来不仅仅是Toptaltal。

Laurent Alis,创始人

临身

Toptal.让找到合格的工程师微风。我们需要经验丰富的ASP.NET MVC架构师来指导我们的启动应用程序的开发,并在不到一周内为我们提供三位伟大的候选人。在我们选择后,工程师立即在线并击中地面运行。它比我们自己发现和兽医候选人更快和更容易。

杰夫凯利,联合创始人

协调解决方案

我们需要在Scala中的一些短期工作,Toptal在24小时内发现了我们一个伟大的开发人员。这不仅仅是通过任何其他平台都无法实现。

Franco Arda,联合创始人

whatadswork.com

Toptal.为正在进行快速发展和规模的企业提供禁令解决方案。每个工程师我们'通过Toptal签约已经很快集成到我们的团队中,并将其工作持有最高标准的质量,同时保持炽热的发展速度。

Greg Kimball,联合创始人

nifti.com.

如何通过Toptal雇用iOS开发人员

1

与我们的行业专家交谈

Tophteal Engineering主任将与您合作,了解您的目标,技术需求和团队动态。
2

与手工选择的人才合作

在几天内,我们'LL向您介绍您的项目的正确iOS开发人员。平均匹配时间在24小时内。
3

右边合身,保证

与您的新款IOS开发人员合作进行试用期(仅在满意的情况下付款),确保他们'在开始参与之前,右边适合。

常见问题解答

  • Toptal IOS开发人员如何不同?

    在Toptal,我们彻底屏蔽了iOS开发人员,以确保我们只与您的最高口径的人才相匹配。每年申请加入Toptal Network的100,000多人,削减少于3%。您将与工程专家(从不泛化招聘人员或人力资源代表)合作,了解您的目标,技术需求和团队动态。最终结果:来自我们网络的专家审计人才,习惯符合您的业务需求。 现在开始。

  • 我可以在不到48小时内到Toptal雇用iOS开发人员吗?

    根据可用性以及您可以进行的速度,您可以在注册的48小时内开始使用iOS开发人员。 现在开始。

  • Toptal IOS开发人员的无风险试用期是多少?

    我们确保您与iOS开发人员之间的每次参与开始于最多两周的试用期。这意味着您有时间确认订婚将是成功的。如果您对结果完全满意,我们会为您收取时间并继续接触,只要您想要。如果你没有完全满意,你将不会收取费用。从那里,我们可以通过部分方式,或者我们可以为您提供可能更适合的另一个专家,并与我们将开始第二名,无风险的审判。 现在开始。

分享
iOS.

如何聘请一个伟大的ios开发人员

自2008年第三方发布以来,iOS App开发人员在iPhone发布的几年中,IOS App开发商的人口显着增加了。现在有超过一百万的IOS移动应用程序,可在App Store上下载,由不断扩大的全球社区提供开发人员。

对于那些希望雇用专用iOS开发人员的人来说,这种新的流行度既是祝福和诅咒。虽然它使IOS程序员比以前更容易,但它还使得它更难以通过许多可用的候选人来定位那些真正的iPhone应用程序开发专家的候选人。

部分挑战在于,真正的专业知识远远超出编码知识。它需要了解实施解决方案的各种选项,以及在生产率,可扩展性,性能和可维护性方面具有这些不同选择的权衡。

考虑到这一点,本文提供了对候选人整体IOS专业知识的深度和广度来评估的问题的抽样。

关于编码,这种招聘指南试图尽可能地成为语言不可行的语言,同时仍在讨论IOS和iPhone开发人员社区的大多数(即在Objective-C中写IOS应用程序的人或那些正在采用各种阶段的人Swift和Cocoa触摸)。然而,重要的是要认识到IOS应用程序也可以用Ruby,Python,C#/。Net,Lua,Pascal,甚至使用抽象库,让您与Web技术写入iOS应用程序。也就是说,由于iOS开发的框架是由Objective-C编写的大型和大,因此需要对某些Objective-C概念的基本知识进行IOS开发,因此在本指南中讨论。

一个注意事项:这些样本问题仅作为指导。不是每个值得招聘的“A”候选人将能够正确地回答他们所有人,也没有回答他们所有人都保证了“A”候选人。相反,这些问题旨在作为整体有效招聘过程的有价值的组成部分,如我们帖子所述 寻找精英少数。在一天结束时,招聘仍然是一种艺术,因为它是一种科学。

评估基础

IOS编程(特别是Objective-C特别)的基本面应该熟悉。这里有些例子。

问:描述使用方法和消息的使用。讨论这种方法的一些优点和缺点。

Objective-C.中的方法与类相关联。 Objective-C具有需要(以对象为导向的Partrance)的实例方法,可以仅用一个类调用的类和类方法(例如,与Java中的静态方法的概念类似)。

Methods are invoked by sending them a message. Here’s an example of sending a message to a myUser object:

[myUser allowAuthorizationTo: secretChamber forDuration: oneHour]

在Objective-C中,与许多其他语言不同(包括SWIFT!),我们可以将消息发送到NULL对象,没有负副作用(邮件被忽略并执行仍在继续)。

在早期版本的Cocoa Toolchain中,您还可以调用编译器在编译时的方法无法确定存在的方法。虽然这可能听起来像强大的能力,但它更常见于牵引调试方案的源泉。

重要的是要注意到这里,除了“奇怪的”方括号发送消息之外,还有不知情的眼睛,目标-C 出现 要具有外部参数名称的概念(从SWIFT借来的术语),但情况并非如此。在上面的示例中,所谓的方法 必须 have forDuration: plus an accompanying parameter, and it 必须 处于方法调用中的相同位置。

(有关参数名称如何在Objective-C中工作的更多信息,请参阅此 博客条目 由Bill Bumgarner,为响应这一点而写的 在蟒蛇上邮寄 由Toptal's Ryan Wilcox.。)

问:什么是选择器,其目的是什么?提供可以使用的位置和方式的示例。

A 选择器 是用于选择要为对象执行的方法的机制,或者在编译源代码时替换名称的唯一标识符。选择器像一个动态函数指针,它指向Class'方法的实现。

As an example, suppose you had a selector for the method run, and three classes (Dog, Athlete, and ComputerSimulation) that each implemented a method run. The selector could be used with an instance of each of the classes to invoke its run method, even though the implementation might be very different for each.

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

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

这 ability to check dynamically at runtime if a class supports a method can be particularly useful with delegates (see the next question in this guide) that can have optional methods a developer can choose to implement or not. A common pattern is to use respondsToSelector: to see if a delegate object implements an optional method before sending it that message. For example:

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

如上所述 Apple的iOS文件但是,您无法测试是否对象 继承. a method (from its superclass) by sending respondsToSelector: to the object using the super keyword. Sending respondsToSelector: to super is equivalent to sending it to self. Instead, you should use the instancesRespondToSelector: method on the object’s superclass, for example:

if( [MySuperclass instancesRespondToSelector:@selector(aMethod)] ) {
    // invoke the inherited method
    [super aMethod];
}

Q: What is the delegate pattern and what is it used for? Describe the delegates used by a UITableView.

委派是一个对象依赖于另一个对象来提供一些定义明确的功能,状态信息,数据或事件的物体的位置。如上所述 Apple的Cocoa开发人员指南“委派的主值是它允许您轻松自定义一个中央对象中的多个对象的行为”。

A great example of delegation is the UITableView object that is typically used when a table is rendered on the screen. The UITableView employs two different delegates:

  1. UITableViewDelegate:如果用户拥有,则调用,例如,选择一个单元格,或者确定行的高度应该是什么。
  2. UITableDataSource:用于检索与表格中的每个单元格如何呈现有关的信息,其中有多少行,如果可以编辑或移动行,等等。

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

类别是扩展现有类的一种方法,并且是使用子类的替代方案。子类化和类别之间的主要区别是类别为现有类本身添加功能,然后在您的代码中使用该类或其子类的任何位置可用。相比之下,子类化创建一个添加(或更改)功能的新类。然后,您必须使用该新子类,而不是原始类或任何子类,以访问此扩展或修改的功能。

例如,Objective-C中的公共字符串对象是NSString,它具有可变子类NSMutableString。当您使用类别来扩展NSString类时,代码中的每个NSString和NSMutableString对象都将支持这些新方法。然后可以在导入类别标题文件的任何类中在任何NSString或NSMutableString上调用这些新方法。

但是,与类别的潜在陷阱是名称冲突。如果在引用类中实现具有与现有方法相同的名称的类别方法,则运行时处的行为是未定义的(即,它是不可预测的,将调用方法的哪个版本)。为避免名称冲突,Apple建议在任何类别方法之前使用三个字母的前缀。

对类别的另一个限制是它无法为类定义新的实例变量。但是,经验丰富的开发人员将意识到您可以使用Objective-C运行时方法定义与类关联的新状态对象,该方法为类别存储状态更改提供了一种方法。

问:描述Cocoa的错误处理。

Most errors are handled in Cocoa via NSError. Two of the more common approaches are as follows:

  1. Pass a blank NSError object into a method and, when the method completes, check to see if that object is still blank or contains an error. (To be entirely precise, pass in a pointer to the NSError pointer, or NSError ** in Objective-C parlance.)

  2. 将NSError对象传递给某些故障委托方法或回调。

NSError 对象具有错误域,错误代码和用户信息词典,以获取其他信息。该附加信息可以包括例如本地化描述和恢复建议,因此稍后的代码可以向用户显示。

In addition to NSError, iOS development also has NSException. Unlike exceptions in other languages, NSException is intended to be used for programming errors only. Cocoa frameworks in general are not exception-safe, so if you generate (or invoke code that generates) exceptions, care should be taken to use try/catch as close as possible to the place where the exception is occurring. In practice, NSException is rarely used in iOS codebases.

Q: What are some common causes of exc_bad_access errors and how might you go about debugging them?

exc_bad_access errors are a common occurrence that can frustrate beginner iOS developers due to the lack of useful debugging information that they provide. They often occur when trying to access an object that was never initialized or has already been released. These errors can also result from passing a parameter to a message that the message is not intended to receive (e.g., passing in an NSInteger when an NSString is expected).

注意,在某些情况下,编译器将提供一个 警告 that, if heeded, can alert the developer to the problem so it can be resolved before any runtime error occurs. But if such warnings ignored, exc_bad_access errors may occur. Here, for example, is erroneous code that is attempting to format a string using an integer variable:

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

%@ in the string format specification indicates that an object, rather than an integer, is expected (an integer would be represented with %d). This statement will therefore result in a compiler warning and, if ignored, will result in an exc_bad_access error at runtime.

But not all causes of exc_bad_access errors will be identifiable by the compiler.

A common cause of exc_bad_access errors that are not detectable by the compiler is attempting to access released objects. In such cases, enabling NSZombies in Xcode can be an effective debugging technique. Enabling NSZombies keeps objects that would normally be released alive as “zombies”. After enabling NSZombies, you can then follow what is happening in your code and receive a message when the application tries to access an object that has been released, thereby identifying the problem in your code. A note of caution though: Be sure to remember to 禁用 NSZombies before submitting the app to the App Store. When NSZombies is enabled, no objects are released and you will be leaking memory constantly until your app eventually is killed due to memory warnings.

深层发掘

如上所述,真正的iOS专业知识远远超出编码知识。经验丰富的iPhone应用程序开发人员将彻底了解IOS平台上的“罩下”发生的内容。它们也将清楚地了解各种实施选项,包括在生产率,可扩展性,性能和可维护性方面具有这些不同选择的权衡。遵循帮助评估候选人专业知识的这一方面。

问:将MRR和ARC频率与Objective-C中的内存管理进行比较和对比。

Objective-c通过使用a跟踪使用的对象,或不使用 保留计数。当另一个对象被另一个对象使用时,它保持计数上升;当任何对象未使用时,其保留计数恢复为零。

在Objective-c中有两种方法可以管理这留下来:

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

MRR.,开发人员必须担心自动起步,或将其放入某些情况下的自动释放池中。

相比之下, 自动照顾许多这些问题。因此,大多数IOS应用程序和开发人员都已转换为弧。事实上,随着SWIFT,需要弧形。

虽然arc确实需要一些思想(例如对象所有权),MRR对开发人员的要求较少。

问:如何在用阴影绘制和动画视图时如何提高性能?

如果需要将影子应用于视图,许多缺乏经验的开发人员将导入QuartzCore框架并将阴影应用于视图的图层属性;例如。:

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

虽然这是一个简单的方法,可以在视图上添加略微透明的阴影,但它可能导致渲染性能不佳。不幸的是,渲染引擎通常需要检查视图的每个像素以确定阴影的轮廓。

但是,您可以定义一个 影子路径 避免这种昂贵的计算并优化渲染。对于标准矩形视图,您将定义一个阴影路径,如:

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

这提供了更好的性能,尽管您必须记住,只要视图的界限发生变化,也需要更新阴影路径。

默认情况下,在带有阴影的动画时动画,在动画的每个阶段都会重新绘制影子。您可以通过阴影优化动画 光栅化 阴影的视图层。当带有阴影的层被光栅化时,它在其本地坐标空间中呈现为位图,然后将其复制到目的地。这是如何透露暗淡暗影效果的示例:

shadowedView.layer.shouldRasterize = YES;
// and we need to ensure that it rasterizes for the pixel density of the screen
shadowedView.layer.rasterizationScale = [UIScreen mainScreen].scale;

问:滚动表视图中表现不佳的常见原因是什么?他们怎样才能避免?

当iPhone最初出来时,平滑滚动是积极用户体验的键之一。然而,有许多错误的新手开发人员可以使这可能导致滞后在滚动时发生。例子包括:

  • 不正确使用重用标识符。 滚动表时的默认行为是删除屏幕上的表格单元格,并为显示的新内容创建新的单元格。使用重用标识符时,当单元格关闭屏幕时,不会被解除分配,而是缓存以进行重用。如果新的单元格以相同的重用标识符出现,则使用高速缓存的单元格,并且避免了分配和布置完全新的单元的昂贵操作。相反,必须重新配置缓存的单元格以显示新内容,例如更新显示的文本和图像。

  • 同步加载Web内容。 如果加载是同步完成的,则数据加载时会丢失主线程,这可能会导致滚动时导致可感知的滞后。当正在下载图像以在表格单元中显示图像时,这是一个特别常见的问题。这里的解决方案是在后台使用占位符值或图像并异步加载数据。加载数据后,然后可以将消息发送到主线程以更新相应的单元格。

  • 在设置显示单元时应用昂贵的操作。 昂贵的操作,例如将高分辨率图像转换为缩略图或将复杂的照片滤波器或转换为图像,可能会严重降低显示性能。如果您只需要缩略图大小图像,请在本地存储更小的尺寸。类似地,如果可能,请提前将任何复合变换应用于图像。或者,在从主线程的图像上执行必要的操作,然后一旦图像准备好显示,就会刷新单元格。

  • 过于复杂的视图层次结构。 虽然您可以使用各种UIViews来创建自定义单元格,但如果它过度使用或过度复杂,则可能会降低性能。虽然这种情况变得越来越少,但由于支持的IOS设备的速度增加,仍然可以影响某些设备和场景中的滚动性能。虽然繁琐,但通过实现单元格的内容绘制(即,用UIView替换UIlabels,UiImages等,然后在该视图中实现自己的绘图,可以解决这个问题。如果正常完成,这可以在渲染单元时显着提高性能。

问:将核心数据堆栈图。

核心数据 是Apple的模型层,持久对象存储和对象图管理器。您可能会诱惑调用核心数据Apple的对象关系映射器,但它真的不止于此。

以下是核心数据堆栈的图。

笔记: 找到一个可以从内存映射整个核心数据堆栈的开发人员来说是非常罕见的。核心数据的更重要/频繁使用的部分是下图中图中的橙色突出显示的部分。

问:核心数据线是否安全?您如何在您的应用程序中处理此问题?

核心数据是 不是 线程安全。因此,Apple推荐的方法是使用线程容纳,这需要创建用于访问每个线程上的核心数据对象并具有单个共享持久存储协调器的单独托管对象上下文。如果您需要更大的并发性,您也可以具有单独的持久性商店协调器,尽管这是额外的复杂性,并且还增加了内存使用情况。

Before iOS 5, the developer needed to manually manage the threads. 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, that changes to Core Data objects do not necessarily propagate immediately to other threads. In the standard case, Core Data objects that are loaded into memory are not updated on a different thread until those objects are fetched again from persistent storage. In order for a managed object context to take in changes from Core Data objects on another thread immediately, it needs to be observing the NSManagedObjectContextDidSaveNotification. Once this notification occurs, the object can merge the changes using the mergeChangesFromContextDidSaveNotification: method.

问:描述在iOS平台上实现并发的不同方式。

在IOS平台上提供以下机制以实现并发性:

  • NSThread. Cocoa provides support for creating threads and executing code by subclassing NSThread.
  • NSOperationQueue. NSOperationQueue is a simple API that determines how many things can run simultaneously, then goes and does them. It allows you limit the number of operations running concurrently (e.g., to limit the number of concurrent downloads). While simple and useful, it’s a layer of abstraction beyond manually managing NSThread and the complications that can involve. (It’s often sadly unused.)
  • Grand Central Dispatch (GCD). GCD是Apple提供对低级并发性的访问的方法。 GCD中有很多,但有时你真的想要一个低级工具。 GCD包括一些有用的工具,特别是以下内容:
    • dispatch_async:当给定任务时(块中的代码),它将在将来的某些时候运行它。
    • dispatch_group_async: You can create a group of dispatched tasks using dispatch_group_create() and dispatch_group_async(). You can even wait for all the tasks in the queue to complete with dispatch_group_wait().

奖金部分:SWIFT

迅速 是来自Apple的新编程语言,称为“没有C的Objective-C”。 SWIFT可以与Objective-C并排工作,提供许多改进,使开发人员能够创建更稳定的应用程序,并且在更短的时间内具有更好的性能。总的来说,自IOS SDK的初始版本以来,它是IOS开发的最大变化。在2014年在Apple的WWDC揭幕,并在2014年9月8日发布的生产中使用,Swift也将与IOS 7和OS X Mavericks兼容。

Apple框架在SWIFT中以相同的方式使用,因此有经验的iOS开发人员能够将大多数知识转移到编写SWIFT代码。也就是说,有几个问题有经验的iOS开发人员应该了解关于SWIFT及其与目标-C的互操作性。

问:在哪些方面可以在哪些方面在同一项目中一起使用?这方面有什么限制?提供一个例子。

由于Xcode在两种语言之间自动创建的桥接报头文件,这两种语言都可以使用。

可以在初始化纯表视图时看到一个示例。

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

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

相比之下, the Swift bridge removes the initWith syntax and modifies the formatting automatically to the Swift syntax as follows:

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

幸运的是,Swift能够利用在Objective-C中编写的任何东西,因此您可以创建一个新的Swift项目并仍然使用任何现有的代码库。

但是,此桥接仅在Objective-C中完美地工作到SWIFT(而不是反之亦然),因此在Objective-C文件中无法访问利用SWIFT中新功能的代码。这的示例包括在SWIFT中定义的泛型,元组和结构,其中没有目标-C等同物。不幸的是,这可以使其难以或不可能利用具有现有Object-C代码基础的SWIFT中内置的一些令人兴奋的第三方库。

苹果提供 详细文档 关于如何利用Swift与Objective-C,每个经验丰富的开发人员都应该熟悉。

问:在Objective-C和Swift中比较方法调用和消息。提供一个例子。

虽然Objective-C使用唯一的括号语法来调用对象上的方法,但Swift使用更传统的点表示法。

So, a message like [myUser allowAuthorizationTo: secretChamber forDuration: oneHour] in Objective-C turns into myUser.allowAuthorizationTo(secretChamber, forDuration: oneHour) in Swift.

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

Writing Swift code that interacts with Objective-C means dealing with NSError in the same way Objective-C does. In Swift, however, exceptions are no longer supported.

Using a method that takes an NSError means using an optional variable (a variable that may or may not exist) and the unwrapping the error if it exists.

由于SWIFT是一种新的编程语言,围绕错误处理的最佳实践,特别是调用其他SWIFT代码的SWIFT代码,尚未真正出现在本撰写(2014年9月)。

包起来

通过iOS应用程序开发场景,通过释放完全新的编程语言(SWIFT),它比以往任何时候都变得更加重要,找到了掌握了应用程序开发平台的Elite iPad和iPhone应用程序开发人员,并且可以在这些中转换两种语言。在全职或兼职的基础上为开发团队找到这些专家始终是一个挑战,并且没有简短的指导可以完全覆盖主题,我们希望这篇文章中的问题提供了识别开发人员的起点稳固的移动应用程序开发环境掌握。

特色Toptal IOS出版物

顶级IOS开发人员需求量很高。

开始招聘