Objective-c中property以new开头报错

在ARC中,属性名使用new开头会报错。比如说更改密码中原始密码的输入框叫oldPasswordTextField,可以;新密码的输入框叫newPasswordTextField,对不起,不行,编译错误。

在ARC出现之前,方法名如果以alloc、copy、init、mutableCopy和new开头,标准做法是返回一个retain count+1的对象。在ARC中,默认声明时强制遵守了这一规范:方法名如果以alloc、copy、init、mutableCopy和new开头,会被隐式声明为attribute((ns_returns_retained))。此行为可被显示声明attribute((ns_returns_not_retained))覆盖。

一般情况下不要使用attribute((ns_returns_not_retained))更改这一行为,除非有什么不得不履行的大义。

引用Clang 3.5 documentation | Objective-C Automatic Reference Counting | Retained return values:

A function or method which returns a retainable object pointer type may be marked as returning a retained value, signifying that the caller expects to take ownership of a +1 retain count.

Methods in the alloc, copy, init, mutableCopy, and new families are implicitly marked attribute((ns_returns_retained)). This may be suppressed by explicitly marking the method attribute((ns_returns_not_retained)).

参考帖子:http://stackoverflow.com/questions/24308162/property-name-starting-with-new-prefix-leads-to-bad-access-error-in-ios

Over

Strong-weak Dance 错误两则

第一则:RAC中strong-weak dance不完整造成内存泄露

今天在工程中发现了RAC导致的retain cycle:

1
2
3
4
@weakify(self)
[RACObserve(self, fooProperty) subscribeNext:^(id fooProperty) {
    [self doSomething];
}];

相对于正常的RAC用法:

1
2
3
4
5
@weakify(self)
[RACObserve(self, fooProperty) subscribeNext:^(id fooProperty) {
    @strongify(self)
    [self doSomething];
}];

少了一行@strongify(self)即造成了循环引用,即对于RAC来说,strong-weak dance是必须做的,不做strong-weak dance就会循环引用。

Read on →

iPhone SDK Bug Collection

  1. convertRect:fromView 返回乘以screen scale以后的结果:
    在iOS8上,view如果未添加到任何window,调用此方法可能会出现此后果。

  2. 定高UITextView输入时,文字超过text view高度,输入光标被遮挡或截断,显示不全,继续输入时正在输入的内容也被遮挡:
    参考iOS8的UITextView输入光标显示不全的hack

  3. window.rootViewController设置后,老的rootViewController的view仍然贴在window上:
    参考[UIWindow setRootViewController:]后view无限叠加的问题修复

Over

在Debina VPS上安装3proxy,支持HTTP、HTTPS、SOCKS代理

3proxy是俄罗斯人写的代理软件。

首先在debian上安装,推荐安装脚本

1
2
3
4
wget --no-check-certificate https://raw.github.com/benjamin74/3proxy/master/3proxyinstaller.sh
chmod +x 3proxyinstaller.sh
./3proxyinstaller.sh
  

然后编辑设置:

1
vim /etc/3proxy/3proxy.cfg

修改登录帐号密码,将users行改为如下内容,后面即可使用用户名user1/密码passwd1,或用户名user2/密码passwd2登录:

1
2
users user1:CL:passwd1
users user2:CL:passwd2

修改代理端口,在3128端口开启HTTP和HTTPS代理,1080端口开启SOCKS代理:

1
2
proxy -a -p3128
socks -a -p1080

启动3proxy:

1
/etc/3proxy/3proxy /etc/3proxy/3proxy.cfg &

另外安装脚本已经自带开机启动设置了。

更多设置参考3proxy manual

Over

在Debian VPS上安装dnsmasq解决DNS污染

warning: 我的有台DNS因为装了dnsmasq没做加密,被服务商提示有被DDoS攻击风险,强制断线了。

1. 安装

首先连上VPS,安装dnsmasq:

1
sudo apt-get install dnsmasq

我的VPS连接debian的APT服务器IPv6地址连不上,如果同样卡在连接 http://http.debian.net 不动的话,建议关掉IPv6再重试安装。

2. 配置

打开配置文件:

1
vim /etc/dnsmasq.conf

填入以下设置,将google的服务器作为上级DNS:

1
2
server 8.8.8.8
server 8.8.4.4

较新版本dnsmasq只破DNS污染,无需特殊服务的话,没必要更改其他设置,直接重启即可:

1
service dnsmasq restart
Read on →

10.11 EI Capitan兼容老使用习惯的一些设置

Terminal在非视网膜屏幕的字体平滑

Preferences -> Profiles -> Text -> Antialias text 打开(视网膜屏安装10.11时默认关闭了)

Safari command+数字键开启书签栏页面

Preferences -> Tabs -> Use command-1 through command-9 to switch tabs 关闭(10.11默认改为切换tab了)

Over

Xcode插件

1. Alcatraz

其他插件的 package manager, 可以从此插件中搜索、安装、删除其他插件。
Github地址

2. VVDocumenter-Xcode

///生成 Javadoc-Style 注释,可被 Xcode 识别,可生成文档。
Github地址

3. MCLog

Log 的 filter,支持正则,响应式交互,尚有崩溃,不过值得一用。
Github地址

4. Clang-Format

一键格式化脏乱差代码。还支持自动按段落排序#import “headers”。
安装后在工程中建立 .clang-format 文件,在其中配置代码格式,再使用此插件格式化代码。
前几天发pr修复了和 oh-my-zsh 同时使用的一处 crash,作者刚刚merge了,建议更新到最新。
推荐格式:

1
2
3
4
5
BasedOnStyle: WebKit
BreakBeforeBraces: Allman
PointerAlignment: Right
IndentCaseLabels: true
AlignAfterOpenBracket: true

Github地址

5. FuzzyAutocomplete

代码自动补全的增强工具,输入反应稍微减慢,不装其他输入增强工具时卡顿尚可接受,值得一用。
Github地址

Over

Architectures 与 Valid Architectures 在 Xcode 中的设置

关于这几个设置项,先看官方说明:

  1. Architecture:
    Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.

  2. Vaild Architecture:
    Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If the resulting architecture list is empty, the target generates no binary.

  3. Build Active Architecture Only:
    Boolean value. Specifies whether the product includes only object code for the native architecture.

Read on →

在OpenWRT上搭建ssh代理

首先为何要用ssh代理,而不是ShadowSocks或VPN:GFW会针对ShadowSocks或各种VPN协议做解析,却不一定有勇气禁止全部ssh连接(国家曾经有次物理断开到国外的全部网络连接造成了巨大经济损失)。

前段时间开发了SSHMole,用作OS X上的ssh代理客户端。然而MAC给iPhone开ssh代理,或在iPhone上直接开ssh代理还是很麻烦的。所以在家里路由器上开了个ssh -D。

0. 首先要有一台VPS

没有的话到vpsadd买一台。

1. OpenWRT上安装ssh-client, openssh-keygen

登录到OpenWRT,移除ssh到dropbear的软连接

1
2
mv ssh dropbear-ssh
mv scp dropbear-scp
Read on →

安装指定版本的CocoaPods

在同事机器上,pod 工作的很正常,到了我的机器上,就 link error,原因是他的 pod 自动生成的.a 和我的 pod 自动生成的 .a 带的前缀不一样。

Read on →