In 2005, 托马索的职业生涯始于软件工程师,然后在2011年跨入移动开发领域, 将两个世界连接在一起. 加入企业和敏捷方法将他的职业生涯推向了下一个阶段——tdd和干净的代码让他大吃一惊! Since 2015, Tommaso曾在专题小组工作过, 照顾每一个发展方面, 从后端到前端的持续交付流程.
Jakiša拥有超过15年的经验,为一系列操作系统开发各种类型的应用程序. 他的大部分技术专长是c++开发, 但他也很擅长使用JavaScript, C#, and Java. As for environments, 他知道使用Windows API的细节, embedded programming, and distributed systems. 他具有Linux/Unix系统,macOS以及Android和iOS等移动平台的工作知识.
At Toptal, 我们会对iOS开发者进行全面筛选,确保为你提供最优秀的人才. Of the more than 200,每年有5000人申请加入Toptal网络, 只有不到3%的人能达标. 你将与工程专家(而不是一般的招聘人员或人力资源代表)一起了解你的目标, technical needs, and team dynamics. 最终的结果是:经过专家审查的人才从我们的网络,定制匹配,以满足您的业务需求.
我能否在48小时内通过Toptal雇佣iOS开发者?
取决于可用性和进度, 你可以在注册后48小时内开始与iPhone开发者合作.
Toptal iOS开发者的无风险试用期是多长?
我们确保你和你的iOS开发者之间的每一次合作都有长达两周的试用期. 这意味着你有时间确认订婚是否成功. 如果你对结果完全满意, 我们会给你开时间单的,你愿意多久我们就多久. 如果您不完全满意,我们不会向您收费. From there, we can either part ways, 或者我们可以为您提供另一位可能更合适的专家,我们将与他开始第二轮谈判, no-risk trial.
在Cocoa工具链的早期版本中,您还可以调用编译器使用的方法, at compile time, 无法确定的存在. 虽然这听起来像是一个强大的功能, 它更常见的是一个恼人的调试场景的来源.
这里需要注意的是,除了用“奇怪的”方括号发送消息外, to the uninformed eye, Objective-C appears 有一个外部参数名称的概念(一个从Swift借来的术语),但事实并非如此. 在上面的例子中,方法被调用 must have forDuration: 加上一个伴随的参数 must 在方法调用中处于相同的位置.
As noted in 苹果的iOS文档但是,您不能测试对象是否 inherits 一个方法(来自它的父类) respondsToSelector: to the object using the super keyword. Sending respondsToSelector: to super 等于把它发送到 self. 相反,你应该使用 instancesRespondToSelector: 方法,例如:
For example, Objective-C中常见的字符串对象是NSString它有一个可变子类NSMutableString. 当你使用类别来扩展NSString类, 你代码中的每个NSString和NSMutableString对象都会支持这些新方法. 这些新方法可以在任何导入类别头文件的类中的任何NSString或NSMutableString上被调用.
类别的另一个限制是它不能为类定义新的实例变量. However, 有经验的开发人员会意识到,可以使用Objective-C运行时方法定义与类关联的新状态对象, 哪个为类别提供了一种存储状态更改的方法.
问:描述一下Cocoa中的错误处理.
大多数错误在Cocoa中通过 NSError. 两种比较常见的方法如下:
Pass a blank NSError 对象转换为方法和, 当方法完成时, 检查该对象是否仍然为空或包含错误. (更精确地说,传递一个指向 NSError pointer, or NSError ** in Objective-C parlance.)
将一个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, 然后,您可以跟踪代码中发生的情况,并在应用程序试图访问已释放的对象时接收一条消息, 从而识别代码中的问题. 但要注意的是:一定要记住 disableNSZombies 在将应用提交到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, 它的保留计数恢复为零.
同步加载网页内容. 如果加载是同步完成的, 当数据加载时,它会使主线程停止运行, 在滚动时,哪个会导致明显的延迟. 当下载图像以在表格单元格中显示时,这是一个特别常见的问题. 这里的解决方案是使用占位符值或图像,并在后台异步加载数据. Once the data is loaded, 然后可以向主线程发送消息以更新相应的单元格.
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.
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.