ARTS 打卡 Week 02

用户头像
teoking
关注
发布于: 2020 年 05 月 31 日
ARTS打卡Week 02

每周完成一个 ARTS:

Algorithm: 每周至少做一个 LeetCode 的算法题

Review: 阅读并点评至少一篇英文技术文章

Tips: 学习至少一个技术技巧

Share: 分享一篇有观点和思考的技术文章

Algorithm

LC 75. Sort Colors

class Solution {
public void sortColors(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
// Two pointer
int zero = -1; // nums[0...zero] 全是0的区间
int two = nums.length; // nums[two...length-1] 全是2的区间
int i = 0;
while (i < two) {
if (nums[i] == 1) {
i++;
} else if (nums[i] == 2) {
two--;
swap(nums, i, two);
} else { // nums[i] == 0
zero++;
swap(nums, i, zero);
// i交换至0区间最后一位,因此i指向下一位置
i++;
}
}
}
private void swap(int[] nums, int i1, int i2) {
int temp = nums[i1];
nums[i1] = nums[i2];
nums[i2] = temp;
}
}



Review

WebRTC for Android

这篇文章是讲WebRTC的基础原理,及实现了Android端的demo。

第一部分,用图示+语言描述清楚了WebRTC的核心能力:跨平台P2P实时通信原理;

第二部分,用WebRTC SDK新版本API实现了一个camera本地预览和一个通过google stun服务器来P2P通信的例子。

我按照示例代码,跑通了第一个例子。基本没有碰到障碍。



Tip

BFG Repo-Cleaner

使用BFG对一个4gb的iOS工程进行清理,文件大小上限限制在20mb,.git目录体积从3.6gb减少至900多mb.



Share

针对objc“奇怪”语法的个人理解

Learn Objective-C in Y minutes

先看如下代码及注释:

///////////////////////////////////////
// Objects
///////////////////////////////////////
// Create an object instance by allocating memory and initializing it
// An object is not fully functional until both steps have been completed
MyClass *myObject = [[MyClass alloc] init];
// The Objective-C model of object-oriented programming is based on message
// passing to object instances
// In Objective-C one does not simply call a method; one sends a message
[myObject instanceMethodWithParameter:@"Steve Jobs"];

wiki中的解释是:

Objective-C is a general-purpose, object-oriented programming language that adds Smalltalk-style messaging to the C programming language.



所以简单理解这个语法设计如下:

  • [myObject xxxMessage:@"xxx"]; 这个看起来是“像”是给myObject传递消息

  • myObject.xxxMessage("xxx"); 这个看起来是调用myObject的xxxMessage方法(执行体)



理解了这个概念,发现再看objc的语法就“顺眼”了很多。当然,如wiki所言,将objc理解为“增加了对象消息传递机制的C语言”的话,就更容易理解objc的很多语言细节。



此外,站在2020年的当口,回看1980年代发明的objc,的确会觉得啰嗦。



有了上面的理解,再读下下面这段话:

The Objective-C model of object-oriented programming is based on message passing to object instances. In Objective-C one does not call a method; one sends a message. This is unlike the Simula-style programming model used by C++. The difference between these two concepts is in how the code referenced by the method or message name is executed. In a Simula-style language, the method name is in most cases bound to a section of code in the target class by the compiler. In Smalltalk and Objective-C, the target of a message is resolved at runtime, with the receiving object itself interpreting the message. A method is identified by a selector or SEL — a unique identifier for each message name, often just a NUL-terminated string representing its name — and resolved to a C method pointer implementing it: an IMP.[18] A consequence of this is that the message-passing system has no type checking. The object to which the message is directed — the receiver — is not guaranteed to respond to a message, and if it does not, it raises an exception.[19]



啊呀,即便为一个已知语言(C)添加OOP能力,也有不同的路径啊,而它们之间的不同是消息名和方法引用的代码如何执行:

  • C++ (Simula-style programming model): 方法名在大多数情况下是编译后目标class的一个代码块的边界(naming bound)

  • Objective-C (Smalltalk-style messaging passing model): 一个消息的目标是在runtime确定的,由消息接收object自己解释该消息,而一个方法被识别为selector or SEL -- 每个消息的唯一标识(通常只是一个NUL结尾的string),并解析为一个C函数指针(一个IMP)。因此,消息传递系统是没有类型检查的。消息的接收对象不保证会响应一条消息,且如果不响应,它会抛出一个异常。



发布于: 2020 年 05 月 31 日 阅读数: 53
用户头像

teoking

关注

Monkey plays software. 2018.11.28 加入

程序员。目前主要从事Android和iOS开发。

评论

发布
暂无评论
ARTS打卡Week 02