示例

在创建UItableViewCell时,应该采用如下方式进行实例化。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  

    NSString *CMainCell = [NSString stringWithFormat:@"Cell%d",indexPath.row];     //  0  

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CMainCell];      //   1  
    if (cell == nil) {  
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier: CMainCell];    //  2

        ...
    }  

    // Adjust cell content  
    cell.textLabel.text = @"XXX";    //  3  

    ...

    return cell;  
}  

原理

在ios系统中,tableView的列表单元是不断复用的,这样可以在移动设备上可以保持较高的运行效率,所以采用android系统的移动设备上复用机制也很常用,这个后面再说。

在tableview进行列表单元的绘制时,假设屏幕可容纳的cell的最大数量为6,由于此时内存中此前没有创建过cell对象,所有需要执行2处操作来依次创建,当列表开始向上滑动,上层cell消失,下层cell会利用内存中已存在的cell对象来进行资源复用。

但是如果cell中存在比较复杂的view结构,比如一个button,而相应的创建过程一定要放在2后面,而不能放在3后面,否则会出现叠层的view,因为cell是不断复用的,最初创建的button依然存在。

那么,如果我们想要定制每个cell的内容,需要对cell进行唯一标识,也就是dequeueReusableCellWithIdentifier:CMainCell的作用, 通过唯一的索引来得到cell对象进行相应的定制。

与android对比

在android中列表控件叫做listview,单纯从名字上来讲,android的定义更为清晰准确。

andorid的列表单元复用与ios非常类似,通用做法是创建viewholder来建立cell的缓存,并为每个cell设置tag进行唯一标识。

对于NSFileManager的使用,一直以来我都是用[NSFileManager defaultManager]来获取单例的形式来进行相关操作。

NSFileManager *fileManager = [NSFileManager defaultManager];

if ([fileManager fileExistsAtPath:sourceFile]) {

  NSError *error = nil;
  if (![fileManager copyItemAtPath:sourceFile
                            toPath:destFile
                             error:&error]) {
    // Deal with error
  }
}

引用Apple Developer在overview关于NSFileManager实例化的相关说明:

The methods of the shared NSFileManager object can be called from multiple threads safely. However, if you use a delegate to receive notifications about the status of move, copy, remove, and link operations, you should create a unique instance of the file manager object, assign your delegate to that object, and use that file manager to initiate your operations.

共享单例是可以在多线程下安全调用的。但是,如果你使用delegate来接受有关移动,复制,删除和链接操作的nitification时,应该创建一个唯一实例,将delegate和它绑定,并使用该实例来开始你的操作。

In iOS and Mac OS X v 10.5 and later you should consider using [[NSFileManager alloc] init] rather than the singleton method defaultManager. Instances ofNSFileManager are considered thread-safe when created using [[NSFileManager alloc] init].

所以,[NSFileManager defaultManager]获得的共享单例并不是线程安全的,官方推荐的做法时通过[[NSFileManager alloc]init]来实例化。

NSFileManager *fileManager = [[NSFileManager alloc] init];

if ([fileManager fileExistsAtPath:sourceFile]) {

  NSError *error = nil;
  if (![fileManager copyItemAtPath:sourceFile
                            toPath:destFile
                             error:&error]) {
    // Deal with error
  }
}

// [fileManager release]; //ARC不需要手动释放

More:

妈妈再也不用担心我记不住git操作了

g=git

ga='git add'

gb='git branch'

gba='git branch -a'

gc='git commit -v'

'gc!'='git commit -v --amend'

gca='git commit -v -a'

'gca!'='git commit -v -a --amend'

gcl='git config --list'

gclean='git reset --hard && git clean -dfx'

gcm='git checkout master'

gcmsg='git commit -m'

gco='git checkout'

gcount='git shortlog -sn'

gcp='git cherry-pick'

gd='git diff'

gdc='git diff --cached'

gg='git gui citool'

gga='git gui citool --amend'

ggpnp='git pull origin $(current_branch) && git push origin $(current_branch)'

ggpull='git pull origin $(current_branch)'

ggpur='git pull --rebase origin $(current_branch)'

ggpush='git push origin $(current_branch)'

git-svn-dcommit-push='git svn dcommit && git push github master:svntrunk'

gk='gitk --all --branches'

gl='git pull'

glg='git log --stat --max-count=10'

glgg='git log --graph --max-count=10'

glgga='git log --graph --decorate --all'

glo='git log --oneline'

glp=_git_log_prettily

gm='git merge'

gmt='git mergetool --no-prompt'

gp='git push'

gpoat='git push origin --all && git push origin --tags'

gr='git remote'

grba='git rebase --abort'

grbc='git rebase --continue'

grbi='git rebase -i'

grh='git reset HEAD'

grhh='git reset HEAD --hard'

grmv='git remote rename'

grrm='git remote remove'

grset='git remote set-url'

grt='cd $(git rev-parse --show-toplevel || echo ".")'

grup='git remote update'

grv='git remote -v'

gsd='git svn dcommit'

gsr='git svn rebase'

gss='git status -s'

gst='git status'

gsta='git stash'

gstd='git stash drop'

gstp='git stash pop'

gsts='git stash show --text'

gunwip='git log -n 1 | grep -q -c wip && git reset HEAD~1'

gup='git pull --rebase'

gwc='git whatchanged -p --abbrev-commit --pretty=medium'

gwip='git add -A; git ls-files --deleted -z | xargs -0 git rm; git commit -m "wip"'

从今初3月份开始,陆续奔波于各大招聘会。为了自己的人生和未来,也要开始积极的准备。

豆瓣

在初次尝试网易的笔试后,参加了豆瓣的面试,当然豆瓣也是我最care的公司。最初有场笔试,两张试题,一张重视基础算法和学习能力,一张是基础的Android相关试题。答得还算顺利。

大概三天后,收到HR的短信,通知我参加面试,由于我人在武汉,所以是远程面试。

面试有两轮:

  • 第一轮面试官是Android负责人Bear老师,也就是我后来的mentor
  • 第二轮遇到了豆瓣的技术总监清风老师,绝对的传奇人物(可以去知乎搜滴蜡,是的,绝对闷骚)

内容大多与项目相关,所以过程还算比较容易,最终顺利拿到offer。

因为已经拿到了最想要的offer,所以一直到实习开始,只面试过这一次。

豆瓣不为人知的文艺角落

PS:我一定要吐槽豆瓣的面试效率,这两轮面试实际上间隔了3天,而且每次到了约定的面试时间总是会拖延半个多小时,而且都是我打电话过去,对方才通知相关面试官过来,这点让我觉得很不靠谱。

小米

在豆瓣实习到9月份的时候,开始渐渐对于自己所处的境地有些不满。因为所分配的项目实际处于无人监管的状态,没有PM,没有UI,因为项目本身属于实验项目,很少收到实用的用户反馈,所以自己渐渐有些失去动力,加上第一次接触重构,再没有mentor指导的情况下,也有些力不从心。

不愧是百亿级的公司,门面非常气派,可惜镜头太渣,晚上拍不出效果

这时候收到碎总的邀请,综合了考虑了一下所处的境地,决定去小米试一试。面试的部门是浏览器组。 从豆瓣过去大概用了二个小时,当时以为很快会结束,就没吃晚饭,结果面了3个半小时,可怜了我的胃。当晚共两面。

一面

大多为基础部分,包括Android,算法,数据结构,设计模式等等。

  • 算法 :求出二叉树的最短路径(递归);用栈来实现一个可以返回最大值的新型栈 (需要辅助空间来存储每次push后新变化的最大值)
  • 数据结构:实现一个逆序的单链表
  • 设计模式:单例模式

由于之前的算法基础不是很好,而且我之前准备时主要的精力都放在Android上面了,所以算法部分答得并不理想。后来发现算法题都是《编程之美》的原题,后悔没有提前准备下。

二面

纯算法,面了两道题:

  • 通讯录姓名的快速检索(包括首字母,全拼音,全汉字)
  • 为一段字符串去掉空格(不能引入辅助空间)

三面

十一长假之后,接到通知要去和浏览器的老大简单聊一聊并确认一下入职事宜。我真的是抱着简单聊一聊的心态,结果是另一场面试。由于准备不足(十一疯狂的去了大西北玩了一圈),结果很糟糕,就这样,很戏剧性的丧失了进入小米的机会。其实也更多是自身原因导致的,所以之后的一个多月在寻找更多机会的同时,也在有针对性的弥补自身的弱势。

友盟

我去的时候正好赶上面试官去开会,所以基本一下午的时间都在闲聊。。。

大概快吃晚饭的时候,终于等来了面试官。大概面试了一个小时吧,结果是需要和HR再沟通,今年友盟可能没有校招计划,估计可能项目组不太缺人吧。

面试题印象比较深的有两道:

  • git diff的实现原理
  • 两个人通过电话联系,如何确认传递信息的可信度。(通过可信第三方或者约定一对不可短时间伪造的大素数之积)

豌豆荚

实在没想到豌豆荚来的这么快,还是其他公司的HR效率太低了,之前听说豌豆荚面试很严格,所以已经注定了这场面试很艰苦。

中午在豌豆荚蹭了会新番《进击的巨人》

一面

围绕我的项目深入的谈了一下,暴露了蛮多经验不足导致的实际应用场景中存在的隐患。然后是一道算法:矩阵顺时针遍历输出。因为对于纸上写代码练得不够,所以还是写了比较久。

代码存在一些问题,最常见也是我总是遗忘的————对输入参数的判断。

二面

荣幸见到了前Google的刘春雨老师,人蛮友善的。他也是先问了下项目相关的问题,然后出了两道算法题。

  • 在二维平面内存在很多点,求出其中一条可以贯穿最多点得直线。
  • 具体题目忘记了,记得需要递归总结表达式

其实,据说豌豆荚的面试一共要5-7轮的,但是我的面试已经到此为止了。

豌豆荚的反馈是算法基础不够扎实,代码写的较慢,而且问答时总是有延迟。。

Weico

开始先是笔试,然后在电脑上写了两个Demo。一个是微信朋友圈分享,另一个是微博Timeline,当然时间有限我只写了朋友圈分享,第二个只是简单说了下思路。这些东西不难,主要考察实际编程能力,这个我已经练了很久,所以顺利收到offer。

知名海产品公司吉祥物

布丁移动

面试了大概一个半小时,问了很多的基础,Java偏多,而且面试官更多关注的时语言特性,所以我这种只注重使用技能的只能抹汗了。。唉,一定要将Java编程思想和Jvm原理看完。

知乎

知乎也是我心目中理想的公司,工作环境也不错。

知乎环境很赞,很有良心企业的感觉

一共两面:

  • 聊了Andorid基础,写了一段代码,实现数字到字符串的转换,我的代码效率不高,在面试官的引导下发现了问题。
  • 测试相关,以及散列表的原理。。。直接跪了

总结

这整个过程经历下来也算蛮艰苦的,暴露出的问题也集中在算法和Java基础方面,毕竟一个公司在面试时更偏重的也是基础部分。

最后附张新公司的靓照:

第一篇日志就以Hello World开头吧,也算是一种惯例,或者叫Blog【0】也可以。

之前一直有想写日志的冲动,只是一直放在evernote上,比较零散,一直等闲下来可以去整理整理。

现在有了github pages,可以方便的运用现成的模板和免费的服务器来托管,无限流量,无限空间,这简直太赞了!!

这几天再熟悉一下jekyll,感觉上手并不容易,在ArchLinux和Mac OSX下的配置体验还有一些细微差异,相较而言,还是mac友好一些。

今后要努力的当一名优质的内容提供者!

PS: 博客的名字来自于我最爱的同名歌曲,由林夕谱词,杨千嬅演唱。【丁目】为日本的街道名。

附相关教程若干: