iOS

雇佣 排名前3% of 自由iOS开发者

PT视讯是一个面向顶级iOS开发者的市场, 工程师, 程序员, 程序员, 架构师, 和顾问. 顶级公司和初创公司选择PT视讯的iOS自由职业者来完成关键任务的软件项目.

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

客户的速度 PT视讯 iOS开发者4.3 / 5.0截至2021年12月23日,平均有1105次评论

被领先品牌和初创公司所信赖

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

弗拉基米尔•Mitrovic

自由iOS开发者

塞尔维亚2015年9月23日起在PT视讯担任iOS自由开发者

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

显示更多

克里斯蒂娜林

自由iOS开发者

加拿大2016年1月19日起在PT视讯担任iOS自由开发者

Christina是一名高级QA工程师,精通测试自动化, 测试管理, 对网络和移动应用程序进行手动测试. 她在几个项目中使用硒 网络Driver从头开始创建测试自动化框架,并使用REST-assured和Postman自动化API测试. 在私营和公营部门均有工作经验, 克里斯蒂娜的工作规模很大, 中型, 小型初创公司.

显示更多

丹Napierski

自由iOS开发者

美国2015年12月20日起在PT视讯担任iOS自由开发者

Dan是一名软件架构师和技术专家,专注于区块链技术的应用. 他拥有多年为客户提供专业咨询服务的经验,从初创企业到跨国公司. 他的专长是将严格的测试和防弹的代码带到困难的工程挑战中. 他在人工智能的许多方面都有着深厚的专业知识, 区块链, 机器学习, 和自动化.

显示更多

穆罕默德Mutahr

自由iOS开发者

美国2018年3月2日起在PT视讯担任自由iOS开发者

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

显示更多

阴户征税

自由iOS开发者

以色列自2019年11月2日起在PT视讯担任自由iOS开发者

Yoni在11岁的时候就爱上了编程,现在他不知道如何停止. 他的职业生涯是从c++开始的,从那以后,他把注意力转向了更多面向用户的软件. 在过去的十年里,他亲自参与了知名初创公司的各个部门. 他目前正在寻求帮助开发出色的iOS/macOS应用程序, 在App Store出现之前,他就已经有过发布复杂iOS应用的经验.

显示更多

罗兰Csatlos

自由iOS开发者

罗马尼亚2017年5月29日起在PT视讯担任iOS自由开发者

拥有超过10年的编程经验和6年以上的企业主经验, 罗兰知道与客户进行良好沟通和理解的重要性. 他痴迷于高质量和对细节的关注, 他努力寻找可能的最佳解决方案. 他目前专注于在他的项目中使用线上购物或TYPO3.

显示更多

Bogdan Andrei-Teodor

自由iOS开发者

罗马尼亚自2019年8月5日起在PT视讯担任自由iOS开发者

Bogdan是一名软件工程师,过去几年一直在游戏开发行业工作. 他的职业生涯从c++开始(前四年),然后转向团结和c#(过去3年). Bogdan在公司和创业环境中都工作过,能够很快地将他的代码转换到其他语言(他有使用C语言的经验, Java, JavaScript, PHP, Python, 和Bash /批).

显示更多

托马索Resti

自由iOS开发者

西班牙2016年4月11日起在PT视讯担任iOS自由开发者

In 2005, 托马索以软件工程师的身份开始他的职业生涯,然后在2011年跨入移动开发领域,这将两个世界联系在了一起. 加入企业和敏捷方法论将他的职业生涯推到了下一个层次——tdd和干净的代码让他大吃一惊! 自2015年以来, 托马索曾在特警队工作过, 关注每一个开发方面, 从后端到前端,再到持续交付过程.

显示更多

Jakisa Tomic

自由iOS开发者

德国自2019年10月2日起在PT视讯担任自由iOS开发者

Jakisa拥有超过15年的经验,为一系列操作系统开发各种类型的应用程序. 他的大部分技术专长是c++开发, 但他也很擅长使用JavaScript, C#, 和Java. 至于环境, 他知道使用窗户 API的细节, 嵌入式编程, 并对Linux/Unix系统有一定的了解, macOS, 以及移动平台(安卓和iOS).

显示更多

马修Achard

自由iOS开发者

越南自2019年2月25日起在PT视讯担任自由iOS开发者

Matthieu是一名法国的全栈JavaScript开发人员,他为各种初创公司发布过许多最小可行产品(mvp). 其中一个mvp streamroot在2019年被卖给了CenturyLink. 除了他深厚的技术知识, 马蒂厄还拥有与世界各地的远程队友成功合作自由职业项目的经验, 包括日本, 美国, 和英国.

显示更多

艾哈迈德Yosri

自由iOS开发者

罗马尼亚自2019年3月11日起在PT视讯担任自由iOS开发者

艾哈迈德自2012年以来一直是一名多面手游戏开发者. 他致力于游戏玩法, 着色器, 人工智能, 完整的, 以及Gameloft等公司的业绩, 被遗忘的矿山, 以及一家埃及初创公司. 他喜欢发展,也喜欢学习新技术和算法.

显示更多

现在就注册看看更多的资料.

开始招聘

招聘指南

如何雇佣优秀的iOS开发者

真正的iOS专业知识远不止编码知识. 经验丰富的iOS开发者会对iOS平台有全面的了解, 它的特性, 以及各种实施方案的优缺点. 本指南提供了一些有效的问题样本,以帮助评估应聘者对iOS平台掌握的广度和深度.

阅读招聘指南

iOS招聘资源

Trustpilot
媒体报道

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

尽管对编码员的需求不断增长,PT视讯却以其几乎达到常春藤盟校(Ivy league)水平的审核而自豪.

我们的客户
创建一个跨平台应用,供全世界使用
蒂埃里Jakicevic
创建一个跨平台应用,供全世界使用
奖状

如果没有PT视讯, Tripcents就不会存在. PT视讯 Projects让我们的基金会在产品经理的帮助下快速发展, 带领开发人员, 和高级设计师. 在60多天的时间里,我们从概念到Alpha. 它的速度、知识、专业技能和灵活性是首屈一指的. PT视讯团队和其他内部团队成员一样,都是tripcents的一部分. 他们和其他人一样为开发做出了贡献并获得了所有权. 我们将继续使用PT视讯. 作为一个创业公司,它们是我们的秘密武器.

首席执行官Brantley步伐 & 联合创始人

Tripcents

我对PT视讯的经验非常满意. 和我一起工作的专业人士在几个小时内就和我通了电话. 在和他讨论了我的项目后,我知道他是我想要的候选人. 我立刻雇佣了他,他也立刻参与了我的项目, 甚至通过添加一些很棒的设计元素来增强我们的整体外观.

导演保罗•Fenley

K邓恩 & 的同事

与我搭档的开发人员都非常出色——聪明、有动力、反应灵敏. 过去很难找到高质量的工程师和顾问. 现在不是.

瑞安·洛克菲勒,首席执行官

Radeeus

PT视讯立即理解了我们的项目需要. 我们请来了一位来自阿根廷的优秀自由职业者, 从第一天起, 投身于我们的行业, 与我们的团队完美融合, 理解我们的愿景, 并产生了一流的结果. PT视讯使得与高级开发人员和程序员的联系非常容易.

Jason Kulik创始人之一

ProHatch

作为一家资源有限的小公司,我们不能犯代价高昂的错误. PT视讯为我们提供了一个经验丰富的程序员,他能够立即投入工作并开始贡献. 这是一个伟大的经历,我们会在心跳中再次重复.

斯图尔特·柏克尼校长

站点专用软件解决方案

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

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

照片Kharma

Sergio是一个非常棒的开发者. 一流,反应灵敏,工作效率高.

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

PriceBlink

和Marcin一起工作是一种乐趣. 他是主管, 专业, 灵活的, 并且非常快地理解需要什么以及如何实现它.

Andre Fischer首席技术官

POSTIFY

我们需要一位专业的工程师,他能立即开始我们的项目. Simanas的工作超出了我们的预期. 不需要面试和寻找专业的开发人员是一个非常好的时间节省,并使每个人对我们选择转换平台以使用更健壮的语言感到更舒服. PT视讯让这个过程变得简单和方便. PT视讯现在是我们寻求专家水平帮助的第一个地方.

Derek Minor,网络开发高级副总裁

Networld传媒集团

PT视讯的开发人员和架构师都非常专业,也很容易共事. 他们所提供的解决方案价格合理且质量上乘,从而缩短了我们的发行时间. 再次感谢,PT视讯.

首席执行官杰里米鞋号

Kognosi

PT视讯给我们带来了很棒的体验. 他们为我们的应用程序匹配了完美的开发人员,使这个过程非常容易. 它也很容易超出最初的时间框架, 我们能够在整个项目中保持同一个承包商. 我们强烈推荐PT视讯快速无缝地寻找高质量人才.

瑞安莫首席技术官

应用商业技术有限公司

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

首席执行官皮特Casoar

Ronin Play Pty Ltd

与PT视讯合作是一次很棒的经历. 使用它们之前, 我花了很长时间采访其他的自由职业者,却没有找到我需要的. 在与PT视讯接触后,他们在几天内就为我找到了一个完美的开发者. 与我一起工作的开发人员不仅交付高质量的代码, 但他也会对一些我没有想到的事情提出建议. 我很清楚阿莫里知道他在做什么. 强烈推荐!

首席执行官乔治•程

Bulavard公司.

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

伊桑•布鲁克斯首席技术官

Langlotz专利 & 商标工作的公司.

在讨价还价早期, 我们需要一流的开发人员, 以可承受的利率, 及时地. PT视讯交付!

首席执行官劳拉Aldag

讨价还价

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

Michael Gluckman,数据经理

Mxit公司——

PT视讯能够迅速将我们的项目与最优秀的开发人员匹配起来. 开发人员已经成为我们团队的一部分, 我对他们每个人所表现出的敬业程度感到惊讶. 对于那些希望与最好的工程师远程工作的人来说,PT视讯是最好的选择.

创始人Laurent爱丽丝

Livepress

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

联合创始人杰夫•凯利

协同解决方案

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

弗兰科斯巴达,创始人之一

WhatAdsWork.com

PT视讯为快速发展和规模化的企业提供了不妥协的解决方案. 我们通过PT视讯聘请的每一位工程师都迅速融入了我们的团队,在保持卓越开发速度的同时,他们的工作达到了最高的质量标准.

联合创始人格雷格•金博

nifti.com

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

1

与我们的行业专家之一谈谈

PT视讯的工程总监将与您一起工作,以了解您的目标, 技术需求, 和团队动力.
2

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

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

合身,保证

与你的新iOS开发人员合作一段试用期(如果满意就付费), 在订婚前确保他们是合适的人选.

常见问题

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

    在PT视讯, 我们彻底筛选我们的iOS开发者,以确保我们只为你匹配最高水平的人才. 超过100个,每年有1万多人申请加入PT视讯网络, 只有不到3%的人能成功. 你将与工程专家(而不是一般化的招聘人员或人力资源代表)一起工作来理解你的目标, 技术需求, 和团队动力. 最终的结果是:专家从我们的网络中审查人才,定制匹配,以满足您的业务需求. 现在就开始.

  • 我可以通过PT视讯在48小时内雇佣iOS开发者吗?

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

  • PT视讯 iOS开发者的无风险试用期是什么时候?

    我们确保你和你的iOS开发者之间的每次互动都有长达两周的试用期. 这意味着您有时间确认订婚是否成功. 如果你对结果完全满意的话, 我们将按时间向你收费,你们的婚约想继续多久就继续多久. 如果你不完全满意,你不会被收费. 从那里, 我们有两种选择, 或者我们可以为您提供另一位可能更适合的专家,我们将与他开始第二个, 无风险试用. 现在就开始.

分享
iOS

如何雇佣优秀的iOS开发者

自2008年面向第三方开发的iPhone发布以来,iOS应用开发者的数量一直在显著增长. 目前,App Store上可供下载的iOS手机应用已经超过100万款, 由不断扩大的全球开发者社区提供.

对于那些想要雇佣一个专门的iOS开发者的人, 这种新获得的人气既是一种祝福,也是一种诅咒. 虽然它让定位iOS程序员比以往任何时候都容易, 这也使得我们很难从众多的候选人中找到真正的iPhone应用开发专家.

挑战的一部分在于,真正的专业知识远远超出了编码知识. 它需要了解实现解决方案所存在的各种选项, 以及在生产力方面的不同选择所带来的权衡, 可伸缩性, 性能, 和可维护性.

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

关于编码, 这本招聘指南尽量做到语言不可知, 同时仍然面向大多数iOS和iPhone开发者社区(i.e., 那些用objective - c编写iOS应用程序的人,或者正在采用斯威夫特和Cocoa Touch的不同阶段的人). 但我们必须认识到,iOS应用也可以用Ruby、Python、c# /编写.净, Lua, 帕斯卡, 甚至使用抽象库,让你可以用网络技术编写iOS应用程序. 也就是说, 因为iOS开发框架基本上是用objective - c编写的, iOS开发需要一些objective - c概念的基本知识,因此我们将在本指南中进行讨论.

需要注意的是:这些示例问题只是作为一个指导. 并不是每一位值得雇佣的“A”候选人都能正确回答所有问题, 也不能保证回答所有这些问题就能得到一个“A”候选人. 而, 这些问题的目的是作为一个整体有效的招聘过程的一个有价值的组成部分, 正如我们在文章中描述的那样 寻找少数精英. 说到底,招聘既是一门科学,也是一门艺术.

评估的基础

应聘者应该熟悉一些iOS编程的基础知识(特别是objective - c). 下面是一些例子.

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

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

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

[myUser allowAuthorizationTo: secretChamber forDuration: 1小时]

在objective - c中,不像许多其他语言(包括斯威夫特)!), 我们可以向空对象发送消息,而不会产生负面的副作用(消息被忽略,继续执行).

在Cocoa工具链的早期版本中,您还可以调用编译器调用的方法, 在编译时, 无法确定是否存在. 虽然这听起来像是一个强大的功能, 它通常是令人揪心的调试场景的来源.

这里需要注意的是,除了“奇怪的”方括号外,还可以发送消息, 对于无知的人来说, objective - c 出现 外部参数名称的概念(借用斯威夫特的术语),但事实并非如此. 在上面的例子中,正在调用的方法 必须forDuration: 加上一个伴随的参数,然后 必须 在方法调用中处于相同的位置.

(关于参数名在objective - c中如何工作的更多信息,请参见此 博客条目 比尔·布姆加纳的回信 文章PyObjC PT视讯的 瑞安·威尔科克斯.)

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

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

例如,假设您有一个方法选择器 运行,以及三个类别(, 运动员, ComputerSimulation),每个都实现了一个方法 运行. 选择器可以与每个类的实例一起使用,以调用其运行方法, 尽管实现可能会非常不同.

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

respondsto选择器ismemberofclass: 方法返回一个布尔值,该值指示接收者是实现还是继承可以响应指定消息的方法.

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

如果(自我.myDelegate respondsto选择器ismemberofclass: @选择器(allowAuthorizationTo:forDuration:)] {
    (自我.myDelegate allowAuthorizationTo: theVault forDuration: 1小时]
}

正如 苹果的iOS文档,但是,你不能测试一个对象是否 继承了 一个方法(来自它的超类)通过发送 respondsto选择器ismemberofclass: 对象的 超级 关键字. 发送 respondsto选择器ismemberofclass: to 超级 等同于把它发送到 自我. 相反,您应该使用 instancesRespondToSelector: 方法,例如:

if([MySuperclass instancesRespondToSelector:@选择器(方法)]){
    //调用继承的方法
    (超级aMethod);
}

问:什么是委托模式,它的用途是什么? 对象使用的委托 UITableView.

委托是指一个对象依赖于另一个对象来提供一些定义良好的功能, 状态信息, data, 或事件. 如上所述的 苹果的Cocoa开发者指南, 委托的主要价值在于,它允许你在一个中心对象中轻松地定制多个对象的行为。.

授权的一个很好的例子是 UITableView 对象,通常在在屏幕上呈现表时使用. 的 UITableView 雇佣两名不同的代表:

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

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

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

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

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

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

Q:描述Cocoa中的错误处理.

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

  1. 通过一个空白 NSError 对象转换为方法和, 当方法完成时, 检查该对象是否仍然为空或包含错误. (完全准确地说,传入一个指向 NSError 指针,或 NSError * * 在objective - c中说法.)

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

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

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

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

exc_bad_access 由于缺乏有用的调试信息,错误是一种常见的现象,会让新手iOS开发人员感到沮丧. 当尝试访问从未初始化或已经释放的对象时,它们经常发生. 这些错误也可能是由于将参数传递给该消息不打算接收的消息(例如,将参数传递给该消息)而导致的.g.,传入 NSInteger 当一个 NSString 预计).

请注意,在某些情况下,编译器将提供 警告 那, 如果听从, 是否可以提醒开发人员这个问题,以便在任何运行时错误发生之前解决它. 但如果这些警告被忽视, exc_bad_access 可能发生错误. 在这里, 例如, 试图使用整型变量格式化字符串的错误代码:

[NSString string与Format:@"This is %@", 123];

%@ 在字符串格式规范中表示对象, 而不是整数, 是否期望(一个整数将被表示为 %d). 因此,该语句将导致编译器警告,如果忽略,将导致 exc_bad_access 在运行时错误.

但并不是所有的原因 exc_bad_access 错误将被编译器识别.

一个共同的原因 exc_bad_access 在尝试访问已释放的对象时,编译器无法检测到的错误. 在这种情况下,使能 NSZombies 在Xcode中是一种有效的调试技术. 启用 NSZombies 保持通常会被释放为“僵尸”的对象活着. 启用后 NSZombies, 然后,您可以跟踪代码中发生的事情,并在应用程序尝试访问已释放的对象时收到消息, 从而识别代码中的问题. 不过要注意的是:一定要记住 禁用 NSZombies 将应用提交到app Store之前. 当 NSZombies 启用了, 没有对象被释放,你将不断泄漏内存,直到你的应用程序最终由于内存警告而被杀死.

更深入的研究

如前所述,真正的iOS专业知识远不止编码知识. 经验丰富的iPhone应用开发者将彻底理解iOS平台的“底层”情况. 他们还将充分了解现有的各种执行方案, 包括在生产力方面的这些不同选择所带来的权衡, 可伸缩性, 性能, 和可维护性. 下面的问题有助于评估候选人在这方面的专业知识.

Q:比较和对比objective - c中MRR和弧的内存管理方法.

objective - c通过使用 保留数. 当 an object is in use by a不her object it’s 保留数 goes up; when it is 不 being used by any objects, 它的保留计数恢复为零.

在objective - c中,有两种方法来管理这个保留数:

  1. 手动Retain-Release (MRR)
  2. 自动引用计数(弧)

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

相比之下, 自动处理这些问题. 因此,大多数iOS应用程序和开发者都转向了弧. 事实上,使用斯威夫特, 弧是必需的.

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

问:当绘制和动画一个带有阴影的视图时,你如何提高性能?

如果你需要将阴影应用到视图, many inexperienced developers will import the QuartzCore framework 和 apply a shadow to the 层 property of the view; e.g.:

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

虽然这是在视图上添加稍微透明的阴影的简单方法, 它会导致糟糕的渲染性能. 不幸的是, 渲染引擎通常需要检查视图的每个像素来确定阴影的轮廓.

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

shadowedView.层.= [[UIBezierPath bezierPath与Rect: shadowview.边界]CGPath];

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

默认情况下, 当给一个带有阴影的视图添加动画时, 阴影在动画的每个阶段都被重新绘制. 你可以优化动画与阴影 软渲染 带有阴影的视图层. 当有阴影的图层被栅格化, 它在其局部坐标空间中以位图的形式呈现,然后合成到目标. 下面是一个如何栅格化阴影效果的例子:

shadowedView.层.shouldRasterize =是的;
//我们需要确保它光栅化的像素密度的屏幕
shadowedView.层.rasterizationScale = [UIScreen mainScreen].规模;

Q:滚动表视图性能不佳的一些常见原因是什么? 怎样才能避免呢?

当iPhone刚问世的时候, 流畅的滚动是积极用户体验的关键之一. 然而, 新手可能会犯很多错误,导致滚动时出现延迟. 例子包括:

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

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

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

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

问:绘制核心数据堆栈的图表.

核心数据 苹果的模型层、持久对象存储和对象图形管理器是什么. 你可能会把核心数据称为苹果的对象关系映射器, 但其实远不止这些.

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

注意: 很少有开发人员能够从内存中映射出整个核心数据堆栈. 核心数据中更重要/经常使用的部分是下面图中橙色突出显示的部分.

Q: 核心数据线程安全吗? 如何在应用中处理这些问题?

核心数据 线程安全的. 因此,Apple推荐的方法是使用线程包容,它需要创建一个单独管理的对象上下文来访问每个线程上的核心数据对象,并拥有一个共享的持久存储协调器. 如果你需要更多的并发性, 您还可以拥有单独的持久存储协调器, 尽管这增加了复杂性,也增加了内存使用量.

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

请记住, 虽然, 对核心数据对象的更改不一定会立即传播到其他线程. 在标准情况下, 加载到内存中的核心数据对象不会在不同的线程上更新,直到从持久存储中再次获取这些对象. 为了让一个管理对象上下文能够立即从另一个线程的核心数据对象中接收更改, 它需要观察 NSManagedObjectContextDidSaveNotification. 发生此通知后,对象可以使用 mergeChangesFromContextDidSaveNotification: 方法.

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

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

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

奖金部分:迅速

斯威夫特 是苹果公司推出的一种新的编程语言,被称为"不含C语言的objective - c ". 斯威夫特可以与objective - c并行工作, 提供许多改进,使开发者能够在更短的时间内创建更稳定、性能更好的应用程序. 总的来说,这是自iOS SDK首次发布以来iOS开发的最大变化. 在2014年的苹果全球开发者大会上亮相, 2014年9月iOS 8发布后,可以在生产中使用, 斯威夫特也将兼容iOS 7和OS X Mavericks.

Apple框架在斯威夫特中也以同样的方式使用, 所以一个有经验的iOS开发者能够将他或她的大部分知识用于编写斯威夫特代码. 也就是说, 关于斯威夫特及其与objective - c的互操作性,有几个问题是经验丰富的iOS开发者应该注意的.

问:在同一个项目中,斯威夫特代码和objective - c代码有哪些共同的用途? 在这方面有哪些限制呢? 提供一个例子.

这两种语言可以在同一个项目中使用, 多亏了Xcode在这两种语言之间自动创建的桥接头文件.

这方面的一个例子可以在初始化一个纯表视图中看到.

在objective - c语法中,这将被指定为:

UITableView *tableView = [[UITableView alloc] init与Frame:CGRectZero style:UITableViewStylePlain]; 

相反,斯威夫特桥会移除 init与 并将格式自动修改为斯威夫特格式,如下所示:

让tableView: UITableView = UITableView(帧:CGRectZero,样式: .平原)

幸运的是, 斯威夫特能够利用任何用objective - c编写的东西, 所以你可以创建一个新的斯威夫特项目,并且仍然可以使用任何现有的代码库.

然而, 这种桥接只在objective - c和斯威夫特之间完美地工作(反之亦然)。, 因此,利用斯威夫特新特性的代码将无法在objective - c文件中访问. 这方面的例子包括泛型, 元组, 和斯威夫特中定义的结构, objective - c中没有对应的. 不幸的是, 这可能会让我们很难甚至不可能利用一些令人兴奋的第三方库,这些库正在斯威夫特中用现有的objective - c代码库构建.

苹果提供了 详细的文档 如何在objective - c中使用斯威夫特, 哪些是每个有经验的开发人员应该熟悉的.

Q:比较objective - c和斯威夫特中的方法调用和消息. 提供一个例子.

而objective - c使用唯一的括号语法来调用对象的方法, 斯威夫特使用更传统的点符号.

这样的信息 [myUser allowAuthorizationTo: secretChamber forDuration: 1小时] 在objective - c变成 myUser.allowAuthorizationTo (secretChamber forDuration oneHour): 在斯威夫特.

Q:比较objective - c和斯威夫特中的错误处理.

编写与objective - c交互的斯威夫特代码意味着处理 NSError 就像objective - c一样. 然而,在斯威夫特中,不再支持异常.

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

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

总结

随着一种全新的编程语言(斯威夫特)的发布,iOS应用开发领域发生了翻天覆地的变化。, 如今,寻找精通应用开发平台并能在这两种语言之间转换的优秀iPad和iPhone应用开发者变得比以往任何时候都重要. 尽管在全职或兼职的基础上为您的开发团队寻找这些专家总是一个挑战,并且没有一个简短的指南能够涵盖整个主题, 我们希望这篇文章中的问题能够为确定精通移动应用开发环境的开发者提供一个起点.

PT视讯 iOS出版物推荐

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

开始招聘