iOS Developers

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

PT视讯是面向顶级iOS开发者的市场, engineers, programmers, coders, architects, and consultants. 顶级公司和初创公司选择PT视讯的iOS自由职业者来完成他们的关键任务软件项目.

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

Clients Rate PT视讯 iOS Developers4.3 / 5.0在截至2023年3月9日的1357篇评论中,平均而言

深受领先品牌和创业公司的信赖

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

Vladimir Mitrovic

iOS自由开发者

SerbiaPT视讯的自由iOS开发者 Since November 1, 2015

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

Show More

Christina Lin

iOS自由开发者

CanadaPT视讯的自由iOS开发者 Since January 19, 2016

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

Show More

Dan Napierski

iOS自由开发者

United StatesPT视讯的自由iOS开发者 Since December 20, 2015

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

Show More

Muhammed Mutahr

iOS自由开发者

United StatesPT视讯的自由iOS开发者 Since June 9, 2018

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

Show More

Yoni Levy

iOS自由开发者

IsraelPT视讯的自由iOS开发者 Since December 10, 2019

Yoni在11岁时爱上了编程,现在他不知道如何停止. 他从c++开始了他的职业生涯,并将他的注意力转移到更多面向用户的软件上. 在过去的十年里,他在知名创业公司中亲力亲为. 他目前正在寻求帮助创建出色的iOS/macOS应用程序, 早在应用商店出现之前,他们就已经有了推出复杂iOS应用的经验.

Show More

Lorand Csatlos

iOS自由开发者

RomaniaPT视讯的自由iOS开发者 Since December 9, 2019

拥有超过10年的编程经验和超过8年的企业所有者, Lorand深知与客户良好沟通和理解的重要性. 他痴迷于高质量和对细节的关注, 他努力寻找可能的最佳解决方案. 他目前专注于在他的项目中使用Magento或TYPO3.

Show More

Bogdan Andrei-Teodor

iOS自由开发者

RomaniaPT视讯的自由iOS开发者 Since December 4, 2019

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

Show More

Tommaso Resti

iOS自由开发者

ItalyPT视讯的自由iOS开发者 Since November 20, 2019

In 2005, Tommaso最初是一名软件工程师,2011年转向移动开发, 为他连接了两个世界. 加入企业和敏捷方法将他的职业生涯推向了下一个阶段——tdd和干净的代码让他大吃一惊! Since 2015, 托马索曾在特警队工作过, 关注每一个发展方面, 从后端到前端到连续交付过程.

Show More

Jakiša Tomić

iOS自由开发者

GermanyPT视讯的自由iOS开发者 Since November 13, 2019

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

Show More

Matthieu Achard

iOS自由开发者

Dominican RepublicPT视讯的自由iOS开发者 Since November 4, 2019

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

Show More

Ahmed Yosri

iOS自由开发者

RomaniaPT视讯的自由iOS开发者 Since October 30, 2019

Ahmed自2012年以来一直是一名多面手游戏开发者. 他致力于游戏玩法, shaders, 人工智能, full-stack, 以及Gameloft等公司的业绩, Forgotten Mines, 和一家埃及初创公司. 他喜欢开发,也喜欢学习新技术和算法.

Show More

现在注册查看更多资料.

Start Hiring
经常成对出现

获得额外的专业知识

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

A Hiring Guide

招聘优秀iOS开发者指南

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

Read Hiring Guide

iOS Hiring Resources

Trustpilot
PT视讯 in the press

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

尽管对编码员的需求在加速增长,PT视讯仍以几乎常春藤盟校级别的审查而自豪.

Our clients
建立一个跨平台的应用程序,以供全世界使用
Thierry Jakicevic
建立一个跨平台的应用程序,以供全世界使用
Testimonials

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

Brantley Pace, CEO & Co-Founder

Tripcents

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

Paul Fenley, Director

K Dunn & Associates

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

Ryan Rockefeller, CEO

Radeeus

PT视讯立即理解了我们的项目需求. 我们的搭档是一位来自阿根廷的优秀自由职业者, from Day 1, 让自己沉浸在我们的行业中, 与我们的团队无缝融合, understood our vision, 并取得了一流的成绩. PT视讯使与高级开发人员和程序员的联系变得非常容易.

联合创始人Jason Kulik

ProHatch

作为一家资源有限的小公司,我们承担不起代价高昂的错误. PT视讯为我们提供了一个经验丰富的程序员,他能够立即开始投入工作. 这是一次很棒的经历,我们会毫不犹豫地再重复一次.

Stuart Pocknee,校长

网站专用软件解决方案

我们使用PT视讯聘请了一位拥有丰富亚马逊Web服务经验的开发人员. 我们面试了四位候选人,其中一位非常符合我们的要求. 这个过程迅速而有效.

Abner Guzmán里维拉,首席技术官和首席科学家

Photo Kharma

Sergio是一个非常棒的开发人员. 一流的,反应灵敏,高效地完成了工作.

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

PriceBlink

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

André Fischer, CTO

POSTIFY

我们需要一位专家工程师,他能立即开始我们的工程. 西马纳斯的工作超出了我们的预期. 不需要面试和寻找专家开发人员,这大大节省了时间,也让每个人都对我们选择切换平台以使用更健壮的语言感到更舒服. PT视讯使这个过程简单方便. PT视讯现在是我们寻求专家级帮助的第一个地方.

Derek Minor,网站开发的高级副总裁

Networld Media Group

PT视讯的开发人员和架构师都非常专业,易于合作. 他们的解决方案价格合理,质量上乘,缩短了我们的发布时间. Thanks again, PT视讯.

Jeremy Wessels, CEO

Kognosi

我们对PT视讯有很好的体验. 他们为我们的应用程序找到了完美的开发人员,使整个过程变得非常简单. 它也很容易超出最初的时间框架, 我们可以在整个项目中使用同一个承包商. 我们强烈推荐PT视讯,因为它能快速、无缝地发现高素质人才.

Ryan Morrissey, CTO

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

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

Pietro Casoar, CEO

Ronin Play Pty Ltd

PT视讯合作是一次很棒的经历. Prior to using them, 我花了很长时间面试其他自由职业者,但没有找到我需要的. 在与PT视讯接触后,他们在几天内就为我找到了完美的开发人员. 与我共事的开发人员不仅交付了高质量的代码, 但他也会提出一些我没有想到的建议. 我很清楚阿莫里知道他在做什么. Highly recommended!

George Cheng, CEO

Bulavard, Inc.

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

Ethan Brooks, CTO

Langlotz Patent & Trademark Works, Inc.

在希格尔的早期, 我们需要一流的开发人员, at affordable rates, in a timely fashion. PT视讯 delivered!

Lara Aldag, CEO

Higgle

PT视讯让你非常容易找到一个候选人,让你安心,他们有能力交付. 我肯定会向任何寻找高技能开发人员的人推荐他们的服务.

Michael Gluckman,数据经理

Mxit

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

Laurent Alis, Founder

Livepress

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

联合创始人杰夫·凯利

Concerted Solutions

我们需要在Scala做一些短期的工作,PT视讯在24小时内为我们找到了一个优秀的开发人员. 这是任何其他平台都无法做到的.

联合创始人Franco Arda

WhatAdsWork.com

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

Greg Kimball,联合创始人

nifti.com

如何通过PT视讯招聘iOS开发人员

1

请与我们的行业专家交谈

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

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

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

绝对合适

与你的新iOS开发者合作一段试用期(只有在满意时才付费), 在订婚前确保他们是合适的.

FAQs

  • PT视讯 iOS开发者有何不同?

    At PT视讯, 我们会彻底筛选iOS开发人员,以确保我们只为您提供最高水平的人才. Of the more than 200,每年有1万多人申请加入PT视讯网络, 只有不到3%的人符合要求. 你将与工程专家(而不是泛泛的招聘人员或人力资源代表)合作,以了解你的目标, technical needs, and team dynamics. 最终结果是:从我们的网络中专家审查人才,定制匹配以满足您的业务需求. Start now.

  • 我能否在48小时内通过PT视讯聘请iOS开发人员?

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

  • PT视讯 iOS开发者的无风险试用期是多久?

    我们会确保你和iOS开发者之间的每次合作都有长达两周的试用期. 这意味着你有时间来确认约会是否成功. 如果你对结果完全满意的话, 我们会为您收费的,只要您愿意,我们会继续约会. 如果你不完全满意,你就不会被收费. From there, 我们要么分道扬镳, 或者我们可以为您提供另一位更合适的专家,我们将与他开始第二次合作, no-risk trial. Start now.

Share
iOS Developers

如何招到优秀的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).

方法通过向它们发送消息来调用. 下面是一个发送消息到 myUser object:

[myUser allowAuthorizationTo: secretChamber forDuration: oneHour]

在Objective-C中,不像许多其他语言(包括Swift!), 我们可以将消息发送给空对象而没有负面的副作用(消息被忽略并继续执行).

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

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

(有关参数名称在Objective-C中如何工作的更多信息,请参阅此 blog entry 是比尔·布姆加纳对此的回应 post on PyObjC by PT视讯’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: 对象的 super keyword. Sending respondsToSelector: to super 等于把它发送到 self. 相反,您应该使用 instancesRespondToSelector: 方法,例如:

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

问:什么是委托模式,它用于什么? 类所使用的委托 UITableView.

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

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

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

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

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

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

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

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

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

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

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

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

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

In addition to NSError, iOS开发也有 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 %@ 在字符串格式规范中表示一个对象, 而不是整数, (一个整数将表示为 %d). 因此,此语句将导致编译器警告,如果忽略该语句,将导致 exc_bad_access error at runtime.

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

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

Digging Deeper

如前所述,真正的iOS专业知识远远超出了编码知识. 经验丰富的iPhone应用开发者会对iOS平台的“底层”情况有透彻的了解. 他们还将很好地了解各种可用的实现选项, 包括在生产力方面的不同选择所带来的权衡, scalability, performance, and maintainability. 接下来的问题有助于评估应聘者这方面的专业知识.

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

Objective-C跟踪哪些对象正在使用,或者没有使用 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 * shadowwedview = [[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: shadowwedview ..bounds] CGPath];

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

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

shadowedView.layer.shouldRasterize = YES;
//我们需要确保它栅格化为屏幕的像素密度
shadowedView.layer.rasterizationScale = [UIScreen mainScreen].scale;

问:在滚动表视图中性能较差的一些常见原因是什么? 如何避免呢?

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

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

  • 同步加载网页内容. 如果同步加载, 它将在数据加载时使主线程暂停, 在滚动时,哪个会导致可感知的滞后. 当下载图像以在表格单元格中显示时,这是一个特别常见的问题. 这里的解决方案是使用占位符值或图像,并在后台异步加载数据. 一旦加载了数据, 然后可以将消息发送到主线程以更新适当的单元格.

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

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

问:绘制出核心数据堆栈.

Core Data 苹果的模型层、持久对象存储和对象图形管理器是什么. 你可能会想称Core Data为苹果的对象关系映射器, 但实际上不止于此.

下面是核心数据堆栈的图表.

Note: 很难找到一个开发人员能够从内存中映射出整个核心数据堆栈. Core Data中更重要/常用的部分是下面图中突出显示的橙色部分.

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

Core Data is not thread safe. 因此,苹果推荐的方法是使用线程包含,这需要创建一个单独管理的对象上下文来访问每个线程上的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, 对Core Data对象的更改不一定会立即传播到其他线程. In the standard case, 加载到内存中的Core Data对象不会在不同的线程上更新,直到这些对象再次从持久存储中获取. 为了使托管对象上下文能够立即从另一个线程上的Core Data对象中接受更改, 它需要观察 NSManagedObjectContextDidSaveNotification. 发生此通知后,对象可以使用 mergeChangesFromContextDidSaveNotification: method.

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

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

  • NSThread. Cocoa通过子类化提供了创建线程和执行代码的支持 NSThread.
  • NSOperationQueue. NSOperationQueue 是一个简单的API,它决定有多少东西可以同时运行,然后去做它们. 它允许您限制同时运行的操作的数量.g.,以限制同时下载的次数). 虽然简单而有用,但它是人工管理之外的抽象层 NSThread 以及可能涉及的并发症. (遗憾的是,它经常被闲置.)
  • 中央调度(GCD). GCD是苹果提供低级并发访问的方法. 在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年的苹果全球开发者大会上亮相, 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: 1小时) in Swift.

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

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

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

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

Wrap-up

随着全新编程语言(Swift)的发布,iOS应用程序开发场景发生了动摇, 找到精通应用开发平台并能在这两种语言之间转换的优秀iPad和iPhone应用程序开发人员变得比以往任何时候都重要. 为你的开发团队找到这些全职或兼职的专家总是一项挑战,没有简单的指南可以完全涵盖这个主题, 我们希望这篇文章中的问题可以提供一个起点,以确定开发人员是否熟练掌握移动应用程序开发环境.

推荐PT视讯 iOS出版物

顶级iOS开发者的需求量很大.

Start Hiring