不带导航条的UIViewController推出带导航条的UIViewController

左侧controller A隐藏导航条,推出右侧controller B显示导航条,类似这个效果:

Read on →

[UIWindow setRootViewController:]后view无限叠加的问题修复

工程中有时会直接修改window.rootViewController,来导航到新的页面。
按理说对window的rootViewController属性设好了新值,老的rootViewController被释放了,UIKit应当自动把老的rootViewController的view一并remove掉,然而实测并非如此。
在iOS8/9中(更老版本没有测试),当window有rootViewController时,把新的controller赋值给window.rootViewController,老的rootViewController的view还是会留在window上。这些被遗留的view虽然看不见,但是浪费了内存,造成了view泄露;而且view的controller已经dealloc,此时view如果回调或通知controller的话,有造成崩溃的隐患。

多次设置rootViewController后,view结构如图,window上加了多个UILayoutContainerView:

Read on →

iOS8的UITextView输入光标显示不全的hack

在iOS8及以下版本的系统上,在定高的UITextView中,输入内容超过Text View高度后,输入光标有时会在Text View的底部显示不全,如how-to-make-a-uitextview-scroll-while-typing-editing中截图所描述。

尝试了各种方案,挑选了一种体验较好的。在textViewDidChanged:中,检测到正在编辑的区域在文字最下行,无动画滚动到结尾:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- (void)textViewDidChange:(UITextView *)textView
{
    //hack for iOS8
    if (isLessThanIOS9)//in iOS9 Apple has already fixed this bug
    {
        CGRect line = [textView caretRectForPosition:
                       textView.selectedTextRange.start];
        CGFloat overflow = line.origin.y + line.size.height
        - (textView.contentOffset.y + textView.bounds.size.height
           - textView.contentInset.bottom - textView.contentInset.top);
        if (overflow > 0)//If at the bottom of text view
        {
            //disable animation. Otherwise, when a input confirm scroll animation is doing, input new text, animation will re-do from animation beginning, which looks strange.
            [UIView setAnimationsEnabled:NO];

            //scroll to text end
            [textView scrollRangeToVisible:NSMakeRange([textView.text length], 0)];
            [UIView setAnimationsEnabled:YES];
        }
    }
}

Over

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