逝水流年

This is a blog to record my life, my work, my feeling …

20120130工作小结

除了checked_delete外,今天还学习了两点内容:

1、char strdup(char s); 函数,使用malloc方法,拷贝一个新的s,返回,需要使用free释放;还有类似的strndup等。

2、bundle:Iphone开发中bundle是一个目录,其中包含了程序会使用到的资源,这些资源包括了图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in),cocoa框架提供了NSBundle类来对其进行操作。

Imcomplete Class Type Delete(不完整类类型的删除)

当delete不完整类类型对象的时候,不会调用对象的析构函数,导致内存泄漏。所以要避免delete 不确定类型。

首先解释下不完整类类型Imcomplete class type:只见声明不见定义的类、结构体或是联合体;相对应的就是complete type,就是编译器可以确定的类型。

下面举例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//delete_object.h
class CObject;
void delete_object(CObject* pObj); //p为imcomplete type
//delete_object.cpp
void delete_object(CObject* pObj) {delete pObj;}
//CObject.h
class CObject
{
    //destructor
    ~CObject()
    {
        //destructor called.
    }
}
//main file
#include "delete_object.h"
#include "CObject.h"
int main(int argc, char[] argv)
{
    CObject* pObj = new CObject();
    delete_object(pObj);
}

这里的pObj对象在delete的时候就是不确定对象,编译器不知道它的类型,无法调用析构函数,最终导致内存泄漏。解决的最简单的方法,就是在delete_object.cpp文件中增加#include “CObject.h”语句即可。

我们这里要重点介绍的是boost库中的使用的方法,方法使用的非常巧妙。整理如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//utiles.h
template<typename T>;
inline void checked_delete(T * x)
{
    // intentionally complex - simplification causes regressions
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
    (void) sizeof(type_must_be_complete);
    delete x;
}
template<typename T>;
inline void checked_arraydelete(T * x)
{
    // intentionally complex - simplification causes regressions
    typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
    (void) sizeof(type_must_be_complete);
    delete[] x;
}
template<typename T>;
struct checked_deleter
{
    typedef void result_type;
    typedef T * argument_type;
    void operator()(T * p) const
    {
        checked_delete(p);
    }
};
template<typename T>;
struct checked_arraydeleter
{
    typedef void result_type;
    typedef T * argument_type;
    void operator()(T * p) const
    {
        checked_arraydelete(p);
    }
};
//main file
//#include "delete_object.h"
#include "CObject.h"
#include "utiles.h"
int main(int argc, char[] argv)
{
    CObject* pObj = new CObject();
    //delete_object(pObj);
    checked_deleter<CObject>;(p);
}

既能在静态编译时监测出delete是否有问题,也可以安全的删除,不用再担心内存泄漏了!

20120130工作记录

plist文件的作用还真是不少,今天就接触到两点:

1、设置App启动界面,在plist中add row,name=Launch Image,Value=XXX.png。

2、设置status bar样式,name=status bar style,value=opaque black sytle等三种。

等同于代码[application setStatusBarStyle:UIStatusBarStyleBlackOpaque];

UINavigationController:使用堆栈方式来管理UIViewController。适用与层次化工作流。

[self.navigationController pushViewChontroller:nextController animated:YES];

[self.navigationController popViewControllerAnimated:YES];

UITabBarController:适用与各部分相对比较对立的情况。

STL之Trim

今天无意之间看到了通用类的三个函数,是用STL实现字符串去掉首尾空格,方法用的颇为简洁,记录下来分享和学习下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <string>;
#include <algorithm>;

using namespace std;

string&  lTrim(string   &ss)
{
    string::iterator   p=find_if(ss.begin(),ss.end(),not1(ptr_fun(isspace)));
    ss.erase(ss.begin(),p);
    return  ss;
}

string&  rTrim(string   &ss)
{
    string::reverse_iterator  p=find_if(ss.rbegin(),ss.rend(),not1(ptr_fun(isspace)));
    ss.erase(p.base(),ss.end());
    return   ss;
}

string&   trim(string   &st)
{
    lTrim(rTrim(st));
    return   st;
}

20120118工作总结

这两天老大给分配了新的任务,学习最新的NBI-MapKit,编写地图DEMO,激动,终于要开始编程了。SDK很简单,一个MapKit.framwork,包含两个文件MapKit.docset和MapKit.framework。包括6个headers和一个静态库,真的很简单。

再细看docset,发现模块也不是特别多,但是接口多的不行,在原有的CCI基础上又包装一层,以后值做UI了,

方便了开发但是学到的东西就少了。以后还得学习底层开发。自己捣鼓了一下午,终于学会了如何导入framework和.a库,如何设置编译选项,丫的编译还是有问题。已经完全按照说明做了,郁闷。

今天把错误跟QA说了下,原来丫的给我的版本不对。没办法,根据她给我的WEB SITE,自己注册下载了最新的SDK,哈哈把Sample也一起下载了,爽。果断重建工程,在buildphase中加入framework和.a及相关的几个framework和库,加上编译条件-lstdc++,编译,successed!耶。

下面就开始UI布局了,按照原来的UI样子,学着使用Interface Builder进行UI设计,娘的,跟使用MFC做界面一样麻烦,弄了半天才弄好了一个Navigation和ToolBar,最后弄好了Tray。可以鱼目混珠啦。哈哈,做了个假的Map。

这两天学到了如何建立Iphone工程,如何导入第三方库和framework,如何设置编译选项,如何使用UIView等控件进行界面设计。东西很杂,但是都是基础,还需锻炼。尤其是对整个工程的架构上面来看,还不是很熟练,在年前这几天争取要把UI全部做出来,先不考虑架构,只做UI和基本功能,等基本功能做完后可以考虑第一次重构将架构重新设计,这时候应该轻车熟路了。

20120116工作记录

今天老大没来,我今天的考核又泡汤了,哈哈,也好有时间可以再深入学习下。把自己几百块的餐票都给了j,嘿嘿,团队就是要相互帮助。

今天继续对上周的疑问进行攻克,编写DEMO深入进去,对UI进行了解,也对Objective-C进行深入了解。

UIScrollView的几个属性和委托方法:

1、zoomscale:当前缩放倍数。初始值设置,只有在将contentView加为sub view后才起作用。

2、contentSize:内容的大小,如果想要scrollview进行缩放和平移,那么contensize的大小需要设置为scrollview内容的的最大值。

3、contentoffset:这个属性是指内容视图相对于scrollview的frame的顶点的偏移量,通过它可以计算当前视图的center point。这个属性非常关键。

center.x = contentOffset.x + frame.width/2; center.y = contentOffset.y + frame.height/2;

4、需要遵守 ;协议,并设置代理scrollView.delegate = self;

5、要想缩放必须设置 maximumZoomScale和minumZoomScale必须设置为不同的值,才能进行缩放。

缩放过程中进行拖动和放缩的是scrollview的subview,而不是scrollview本身。

6、必须实现委托方法viewForZoomingInScrollView,返回放缩的view,才可以进行放缩。如果想要控制放缩,可以实现委托方法scrollViewDidEndZooming:withView:atScale:方法。

7、如果是实现双击或者单击操作,可以实现UITapGestureCognizer作为scrollview的子类,并通过selector关联到相应的单击或双击方法中。

IOS的坐标系跟WINDOWS坐标系一致,左上角为origin point,向右横向为X轴正放向,向下竖向为Y轴正方向;view的Frame,bounds和center各不相同,其中frame是对父视图的坐标系而言,bounds是对自身的坐标系而言,所以bounds的原点永远都是(0,0),两者的width和height相同,而center者可以通过两者算出来;center是CGPoint一点,是视图中心相对父视图原点的坐标,所以是bounds.width/2 + frame.X, bounds.Height/2 + frame.Y。

这些内容熟练掌握后,对地图界面的理解有容易多了。

流年不利

一整天的时间都泡汤了,要说是流年不利可是有点迷信。全部都是人为啊。有个败家媳妇,让你怎么也木有办法。一大早的就跟人追尾,算下来得花2000块钱。就是有保险也很麻烦,还耽误一天的时间!俗话说的好,听人劝吃饱饭,古人诚不欺我!

都说这人的脾气和性格是决定一个人的命运,太专注也要注意时间,不然多危险啊!还好人没有事。刚接到电话没吓死我,赶快脸都没洗就跑出去,还找了整个小区才找到。郁闷,上来就没给人好气,哈哈,咱还很牛!

一会也要注意了,但是也不能让人家欺负咱。是不是啊?

一整天的计划泡汤了,晚上也木有心情学习了。真的很郁闷。

01112012学习记录

code review 工具的问题继续搞了一上午还是没有搞定,不过在大牛捣鼓的过程中,着实学到了很多内容,特别是一些使用的技巧和手段都是从书上看不来的。

以前的公司也搞CMMI流程,也搞代码审核,但是木有记录,木有审核好坏评价,做的好的坏的木有人管,就是个口号。但是现在不一样了,将网站,SCM通过Python脚本整合到一起,可以方便的在代码check in 之前进行code review,然后指定审核人,审核人必须评定后才可以上传,网站上面有审核记录,都很详细,这样都可以进行追述,有据可查。很多SCM工具都支持各种脚本,SVN也可以,不过就是没人做罢了。

上午学习了几个常用的Unix commands,现在复习下:以后尽量在command下工作,提高下命令的熟悉程度。

1、pwd命令,显示当前位置。

2、ls命令,显示当前文件夹下的内容,有两个参数 -f -1。

3、man命令,帮助命令。

4、cd ~回到当前home目录,cd /opt到opt目录。

5、chmod命令,给文件增减权限,最常用的如chmod +x filename,给文件增加可执行权限。

6、sh命令,当文件premission denied的时候可以试试先执行sh filename,然后chmod +x执行权限后在执行程序。

7、可执行程序执行 ./filename。

8、sp命令,查看进程信息,常跟 grep命令配合,grep命令用来进行匹配。

9、vim命令,用vi打开文件。q退出 ctrl+c或ctrl+d。

10、python命令,查询python的当前使用版本。可以通过命令修改python的版本,具体命令丫的忘了。忘性太大了。

下午原机器的主人来帮忙解决个问题,NND,还说要继续用,不让我用他的用户,谁稀罕啊!正好可以在新用户下自己全部弄一遍,公欲善其事,必先利其器!把要做的在笔记本上一一列出来,一共9项。

1、下载P4V安装,才63M,以为弄错了呢,结果共享中的也是这么大,就2个程序,还得我以为跟VSS一样还得安装呢。搞了半天才弄清楚。OK

2、sync code and build source,run on simulator。已经清车熟路了,轻松搞定。期间the lastest code还有bug,又学会了查看版本和merage不同。OK

3、配置code review,这次很小心的弄,先从本机将P4,脚本和XML导入到MAC mini上,修改XML中的路径,放到指定目录。并将P4配置好,可以执行。然后是在P4V中将code review工具增加上,OK。check in 一个文件进行测试,先建立一个新的pending,然后将代码修改的地方和注释都写详细了,提交code review。OK成功!耶,给出一个网站,登陆可以继续分配code review的人或者discard 或publish。

4、apple certificate申请,还没申请完就下班了,由于要搭同事的车,只能终止下正高涨的情绪,明天继续了。

一路上很顺,到家后做饭,吃饭,总结。明天更美好,要多跟大牛学习。有动力啦。

11012012记录

今天是一个值得纪念的日子!

由于昨天休息,今天早上收到了N个Email,正在浏览的时候发现一条很振奋人心的消息,嘿嘿,我们竟然也有年货,200元购物卡,吼吼,很久没有过年底发东西了!欧耶!兴奋,可能是因为一日之计在于晨吧,早上的兴奋一直延续了一天。老大今天特别忙,我的第一部分学习的讲解又串到明天了。

下午老大竟然主动把刚刚走人的那个的mini给我啦。哈哈我也有mac机器啦。上传小图庆祝下!折腾了一下午,还有其他同事的帮忙,还是木有搞定所有的配置,不过还是很高兴,在自己捣鼓和请教同事的过程中学到了很多内容。尤其是请教大牛帮忙解决P4的配置问题的时候,看他们飞速的commands,使用vim,查找python脚本代码,真牛啊!让我非常兴奋,终于又能迅速学习了,要加油向他们学习,利用自己的优势,榨干他们。欧耶!

也记录下自己下面要加强的内容:

1、SCM P4工具的使用和配置。达到非常熟悉的程度。

2、Python脚本语言的学习,2个月内达到可以自由阅读的程度。

3、学习常用的UNIX命令,和VIM等工具的使用,坚持能不用window就不用windows,要用command。