iOS持久化

  • 文件系统
  • 归档和序列化
  • 数据库

1.文件系统

不管是Mac OS X 还是iOS的文件系统都是建立在UNIX文件系统基础之上的。

1.1 沙盒模型

在iOS中,一个App的读写权限只局限于自己的沙盒目录中。

沙盒模型到底有哪些好处呢?
安全:别的App无法修改你的程序或数据
保护隐私:别的App无法读取你的程序和数据
方便删除:因为一个App所有产生的内容都在自己的沙盒中,所以删除App只需要将沙盒删除就可以彻底删除程序了

Read more…

Blocks编程

  • 介绍
  • 声明创建和调用
  • Block和变量
  • Block实际应用

1.介绍

Block是一个C Level的语法以及运行时的一个特性,非常像标准C中的函数(函数指针),但是其运行需要编译器和运行时支持,目前LLVM+Clang可以很好的支持Block(苹果修改过的GCC也可以)。Block和函数不同的是其语义 闭包 特性,以及可以有匿名block的存在。
你可以在LLVM的官方网站查看Block语言规范.
你可以通过

1
^

运算符来声明一个block变量,或用来表明block定义的开始,而block的代码块则是包含在一对花括号

1
{}

内的.

1
2
3
4
5
int multiplier = 2;  
int (^myBlock)(int) = ^(int num){  
    return num * multiplier;  
};  
printf("%d",myBlock(4));

上面代码中的

1
myBlock

就是Block的变量名,由myBlock变量的声明可以看出,它返回值为int类型,且存在一个int型的参数。
等于号后面就是Block的定义并将其赋值给myBlock .
Block的调用就和C函数的使用类似.

2. 声明创建和调用

Read more…

NSButton With Hover and Active States

如果我想要一个按钮有三种不同的状态:普通状态,鼠标移上去的状态,以及鼠标按下去的状态

首先这是一个功能按钮,按下去会触发相应的动作,比如弹出一个新的窗口。
NSButton 支持设置图片,且可以分别位普通状态和alternate状态(按下去的状态)设置图片,如果你没有设置alternate状态的图片,则按下的时候则显示的比之前的暗些。

1
2
– setImage:
– setAlternateImage:

为了实现既定的效果,大体的思路是这样的:
1.当鼠标不在按钮上的时候 按钮设置成普通按钮图片
2.当鼠标移到按钮上的时候 按钮设置成hover状态的图片
3.按钮被按下的时候,就使用默认的变暗效果(在hover的基础上变暗)

所以这个时候关键问题变成如何去”订阅”鼠标移到按钮内部以及移出按钮内部的事件消息!
并在相应的响应函数中作出相应的图片设置显示操作。

Mouse Event

NSButton使用的使用的鼠标事件处理方式为 “The Mouse-Tracking Loop Approach”
就是只有NSButton的

1
- (void)mouseDown:(NSEvent *)theEvent;

会被调用,所有的鼠标左键事情比如mouseDragged,mouseUp等都会被放到一个队列中,可以通过

1
- (NSEvent *)nextEventMatchingMask:(NSUInteger)mask untilDate:(NSDate *)expiration inMode:(NSString *)mode dequeue:(BOOL)flag

指定mask(比如NSLeftMouseUpMask,NSLeftMouseDraggedMask)获得事情队列中的指定事件.然后对事情做相应的处理。
不过貌似对于hover的效果无需考虑mouseUp和mouseDrag的事件.

TrackingArea

我们要找的是鼠标移到按钮区域内和移出按钮区域内的事件.
所以找到了“Using Tracking-Area Objects”
这个的方式也蛮简单,

1
- (void)updateTrackingAreas;

继承上面的方法,为当前按钮添加一个Tracking-Area,其实就是设置一个控件内的矩形区域以及设置如何跟踪(比如设置跟踪的event NSTrackingMouseEnteredAndExited,NSTrackingMouseMoved,NSTrackingCursorUpdate,设置跟踪的时机 NSTrackingActiveWhenFirstResponder ….).
设置好了之后相应的函数便可以在相应的事件触发后得到响应了。

实现的关键代码片段,继承NSButton

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
- (void)setNormalImage:(NSImage *)image{
    if (normalImage) {
        [normalImage release];
    }
    normalImage = [image retain];
    [self setImage:normalImage];
}

- (void)updateTrackingAreas
{
    [super updateTrackingAreas];
   
    if (trackingArea)
    {
        [self removeTrackingArea:trackingArea];
        [trackingArea release];
    }
   
    NSTrackingAreaOptions options = NSTrackingInVisibleRect | NSTrackingMouseEnteredAndExited | NSTrackingActiveInActiveApp;
    trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect options:options owner:self userInfo:nil];
    [self addTrackingArea:trackingArea];
}

- (void)mouseEntered:(NSEvent *)event
{
    [self setImage:hoverImage];
}

- (void)mouseExited:(NSEvent *)event
{
    [self setImage:normalImage];
}

Make YUNIO Your Git Repo

http://www.yun.io/ 一个云存储同步空间,有Mac的客户端,虽然是QT写的,但是功能还OK。
可以将云存储空间挂载到本地的一个目录。
这些云存储空间其实可以用来作为自己的远程Git仓库

1
2
3
4
5
6
7
8
#在YUNIO的目录中创建一个bare的git库,作为远程git库
cd /Users/Luke/YUNIO/Projects/
mkdir bookhelper.git
cd bookhelper.git/
git init --bare
#在原项目的本地git库中添加远程仓库,并提交
git remote add yunio /Users/Luke/YUNIO/Projects/bookhelper.git
git push yunio master