0%

避免循环引用

Swift 和 Objective-C 一样使用了自动引用计数来进行内存管理。引用计数的内存管理就无可避慢的会产生循环引用这种问题。Swift 针对这个问题也给出了 weakunowned 两种声明非持有所有权的引用修饰符。二者的区别在于 weak 和 Obj-C 中的 weak 完全相同,声明一个弱引用,不会增加被引用内存的引用计数,在所指向的内存被释放时指针会自动被置为 nilunowned 则类似于 Obj-C 中的 unsafe_unretain 修饰符,作用和 weak 相同,但在所致内存被释放后不会被自动置为 nil,而是保留指向原来内存空间的引用,若对象已经被释放后对其发生了方法调用则会造成崩溃。

苹果的推荐使用方法是:在能够确定在访问时对象一定没有被释放的情况下使用 unowned,在不能够确定时使用 weak,这么做的原因我想是因为使用 weak 时由于在内存释放时需要对指针进行置空操作,耗费了一定的性能,所以能够确定的情况下使用 unowned 比较好。

使用弱引用的情况:

  1. 设置 delegate 时
  2. 在 self 持有的闭包中引用 self 时

可以这样标注闭包中的元素,指定它们的内存管理语义:

Read more »

在 Objective-C 中的协议方法分为可选 @optional 和必须 @required 两种。但是在 Swift 中则不同,所有的协议方法都是必须的。如果我们想要声明一个可选的接口,这该怎么做呢?

上代码:

1
2
3
4
5
@objc protocol OptionalProtocol {
optional func optionalFunc1() //可选
func requiredFunc() //必须
optional func optionalFunc2() //可选
}

这是我们需要在协议定义之前加上 @objc 修饰,实际上是让这个协议本身被定义为 Objective-C 的。这里的声明和 Objective-C 不同的是没有 @ 做开头。而且在 Swift 中,所有的前缀修饰符和声明都是完全分开的。也就是说必须为每一个声明都添加一个修饰符。对于没有修饰符的方法来说,他们都是必须实现的。

可选的协议不能被 Struct 和 enum 类型实现,也就是说只能被 class 实现,struct 和 enum 类型中不能包括可选方法或者属性,这算是一个弊端吧。

1.在 Swift 中使用 Objective-C 代码

这种情况下的做法很简单,只需要在项目中添加名为 {product-module-name}-Bridging-Header.htarget名称-Bridging-Header.h 文件,并在这个文件中添加你想要引用的头文件即可。为求方便, Xcode 还会在向项目中第一次添加 Objective-C 文件时候提示是否需要自动添加这个文件。

Read more »

2015年12月4日,苹果正式开放了 Swift 的源代码,Swift 也从此开启了走向了各个平台的征程。苹果首先对 Linux 提供了支持,至于 Windows 嘛…
(对于Windows平台的支持)在Swift开源的初版中,这并不是我们所首要考虑的问题--费德里希
反正这件事自然有人会去做的。这篇文章对在 Ubuntu 上部署 Swift 开发环境进行描述(实际上就是翻译啦)。

本文原文:https://swift.org/download/#linux

Read more »

本文是一篇快速指南:

0x01

打开终端在客户机上生成公钥和私钥:

ssh-keygen -t rsa -C {comment_text} -f {my-key-file}

你将会得到两个文件分别是私钥 my-key-file 和公钥 my-key-file.pub

0x02

将公钥上传到你需要访问的服务器上,建议使用 scp 命令:

scp {my-key-file}.pub -P {端口号} {username}@{ip_address}:.

0x03

使用密码登陆你的服务器,然后在 ~/ 下执行:

cat my-key-file >> ~/.ssh/authorized_keys

0x04

退出连接回到本地终端,回到生成公钥私钥的目录下面执行

cp my-key-file ~/.ssh/

将私钥复制到 ~/.ssh/ 目录下面。

0x05

执行 vim ~/.ssh/config 编辑配置文件,以下是个例子,仅供参考:

1
2
3
4
5
Host alias-name
User username
HostName ip or domainname
Port port number
IdentityFile ~/.ssh/my-key-file

修改后保存。这是还需要一步,就是清除掉之前登陆留下的密钥缓存,之后才可以确保正常登录。
执行 vim ~/.ssh/known_hosts 查找 Hostname 对应的记录,将其删除保存文件即可。

0x06

这时就可以执行无密码登录了 ssh alias-name,爽爽哒。

0x07

可能会遇到配置完成之后连接服务器依然需要输入密码的情况,这一般是由于 .ssh,公钥文件的权限问题导致的,可以按照这个文章中的解决方案进行处理。

0x08

ssh 会话默认情况下很快就会过期,这在使用中很不方便,不过不要紧,这同样有解决办法

ObjectiveC questions

1.What is category? Can you have properties or ivars in a category?

可以,但不能在非匿名类别中使用实例变量。非匿名类别中的属性不会被合成setter/getter方法。需要使用关联对象来解决。

2.What is protocol? What is formal and informal protocol?

协议是一种用于实现多态的机制,遵守协议意味着协议中规定的必须方法需要被实现。是对象能力的一种保证。调用方只要知道被调用放遵守了协议即可,无需知道被调用方是什么类型。
正式协议是使用 protocol 关键字实现的,非正式协议即NSObject类别。

3.What is ARC? Is it garbage collection?

ARC 是自动引用计数,不是垃圾收集。实质上 ARC 还是一种手动的内存管理机制。对象是否释放需要根据引用计数是否为0来判断。引用计数将对对象内存的管理集中在了对象内部。而malloc/free new/delete是在外部的。且release只会减少引用计数,并不会直接收回内存。垃圾收集是全自动的,内存完全由垃圾收集器进行管理。

4.Difference between atomic and nonatomic properties?

atomic保证了属性setter/getter方法操作的原子性(加锁),会带来一定的开销。但并不意味着线程安全。因为在当前线程第一次读取到属性的当前值,紧接着另一个线程对属性进行了修改,此时当前线程又读取该属性就会造成数据的不一致。
nonatomic是不保证原子性的,开销较少。

Read more »

在 Objective-C 的 Fondation 框架中 NSString 对象是很复杂的存在,各种方式创建以及不同长度的字符串都会影响 NSString 对象在内存中所处的位置。Objective-C 在运行时也对其做了很多优化。今天就来研究一下 NSString 这个复杂的对象。

Read more »

实例方法(实例方法)消息转发的顺序如下:

1、检查忽略的Selector,比如当我们运行在有垃圾回收机制的环境中,将会忽略retain和release消息。

2、检查receiver是否为nil。不像其他语言,nil在objective-C中是完全合法的,并且这里有很多原因你也愿意这样,比如,至少我们省去了给一个对象发送消息前检查对象是否为空的操作。如果receiver为空,则会将 selector也设置为空,并且直接返回到消息调用的地方。如果对象非空,就继续下一步。

Read more »