Archive for 六月 2009

64位编程:整数/小数

A 对应64位编程的时候,

对于整数应使用NSInteger和NSUInteger,而非int

对于小数应使用CGFloat,而非float

NSInteger其实是一个自动定义,在32位中为int,而64位中为long。CGFloat的原理类似

误释放对象

W 问题一:

value = [array objectAtIndex:n]; //得到一个数组中的对象
[arry removeObjectAtIndex:n]; //卸载那个对象

因为value得到了那个对象,但是由于另外一个拥有者release了该对象,所以其实value现在成了摇摆指针(无效数据)

问题二:

myArray = [NSArray array];
...
[myArray release];

NSArray返回的是一个自动释放对象,不仅myArray不应该在一段时间后release,而应该在适当的时候先retain,以防止该array被系统误释放。

问题三:

rocket = [rocketLauncher aRocket];
[rocketLauncher release];

和array这种数据收集类对象一样,如果我们得到了一个类的子对象而不retain它,那么在原父类被释放的时候,这个rocket其实也会失去其意义。

Cocoa不同内存管理环境下的autorelease

H 混合内存管理环境:垃圾收集法(Garbage Collection)+索引计数法(Reference Counting)

虽然大多数情况下混合环境是不被推荐的,但是如果在这个情况下,autorelease需要注意以下事项:

垃圾收集混合环境下:应该使用drain方法,因为release在GC模式下没有意义

索引计数环境下:drain和release对于autoreleasepool(自动释放池)的效果相同

对autorelease的误解

A Cocoa的内存管理分为 索引计数法(Reference Counting/ Retain Count)和 垃圾收集法(Garbage Collection)。而iPhone上目前只支持前者,所以autorelease就成为很多人的“捷径”。

但是!autorelease其实并不是“自动释放”,不像垃圾收集法,对对象之间的关系侦测后发现垃圾-删除。但是autorelease其实是“延后释放”,在一个运行周期后被标记为autorelease会被释放掉。

切记小心使用autorelease,理解autorelease,防止在你还需要该对象的时候已经被系统释放掉了。

一些iPhone的系统目录

D

得到Document目录:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

得到temp临时目录:

NSString *tempPath = NSTemporaryDirectory();

得到目录上的文件地址:

NSString *文件地址 = [目录地址 stringByAppendingPathComponent:@"文件名.扩展名"];

随机数生成器

R 来做一个小小随机数生成器吧!从1-100~

***Safari浏览的时候似乎会很乱… 换Firefox看这个帖子吧

随机数生成器
随机数生成器
随机数生成器
//
//  rndNo.m
//  RandomNumber
//
//  Created by Zhengliang Guo on 09-6-17.
//  Copyright 2009 gzl.name All rights reserved.
//

这个程序非常简单,首先建立一个类,选一个自己喜欢的名字:

图片 5

图片 5

看看头文件里面有什么呢?

@interface rndNo : NSObject {
	IBOutlet NSTextField *textField;
}
-(IBAction)resetSeed:(id)sender;
-(IBAction)genderateNo:(id)sender;
@end

m文件里面的洞天:

-(IBAction)resetSeed:(id)sender{
	srandom(time(NULL));
	[textField setStringValue:@"随机数种子已重置"];
}
-(IBAction)genderateNo:(id)sender{
	[textField setIntValue:(random()%100 +1)];
}

在IB里面建立一个对象,然后指定他的类为我的rndNo.

图片 9

//记得将IBAction和IBOutlet连接正确噢~否则不会好使的。
//不会在Xcode里面连接对象?在我的博客里面搜索一下吧!

让我们的程序在点击关闭红点的时候也关闭吧:

首先添加所需的事件代理到m文件:

- (void)windowWillClose:(NSNotification *)notification //当窗口关闭的时候
{
	exit(1);  //我们退出程序
}

右键点击我们的窗口,然后将delegate连接到我们建立的对象上
图片 5

//编译运行!大功告成,还不赶快自己也试试!

多线程 之 NSOperation

T 多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法。而原始的多线程方法存在很多的毛病,包括线程锁死等。在Cocoa中,Apple提供了NSOperation这个类,提供了一个优秀的多线程编程方法。

本次讲解NSOperation的使用方法:

1,将想在另外一个线程的工作单独成类,并设置其父类为NSOperation:

@interface ImageLoadingOperation : NSOperation {
    NSURL *imageURL; //这个例子里面需要传入一个图片地址,所以定义一个NSURL变量
    id target; //由于需要返回一些值,所以需要一个对象参数返回要被返回的对象(运行此线程的类对象)
    SEL action; //返回值要激发的方法函数
}

2,借由其初始化方法来传入所需要的参数和对象

- (id)initWithImageURL:(NSURL *)theImageURL target:(id)theTarget action:(SEL)theAction
{
    self = [super init]; //在老帖里面解释过为什么需要这么做了
    if (self) {
        imageURL = [theImageURL retain]; // 拷贝进对象,并retain(为什么?请查老帖)
        target = theTarget;
        action = theAction;
    }
    return self;
}

呼叫这个类对象的时候,传入所需要的参数和对象

// 这些是需要对其初始化的类中的代码
ImageLoadingOperation *operation = [[ImageLoadingOperation alloc] initWithImageURL:url target:self action:@selector(didFinishLoadingImageWithResult:)];  //初始化
[operationQueue addOperation:operation]; //添加到运行队列
[operation release];  //由于队列对其retain,所以我们需要release它

3,在我们的线程操作类中的main函数执行所需要的工作

- (void)main
{
    // 同时载入图片
    NSData *data = [[NSData alloc] initWithContentsOfURL:imageURL];
    UIImage *image = [[UIImage alloc] initWithData:data];
 
    // 打包返回给初始类对象,然后执行其指定的操作
    NSDictionary *result = [NSDictionary dictionaryWithObjectsAndKeys:image, ImageResultKey, imageURL, URLResultKey, nil];
    [target performSelectorOnMainThread:action withObject:result waitUntilDone:NO];
 
    [data release]; //不需要了就清理
    [image release];
}

这些就是一个简单的NSOperation的使用过程了。其实看看嘛,非常简单的,正如苹果为我们准备的其他API一样!

常用编程快捷键(Xcode/Emacs)

S

control-F: 向右一个字符(forward)

control-B: 向左一个字符(backward)

control-P: 前一行(previous)

control-N: 后一行(next)

control-A: 去行首

control-E: 到行尾(end)

control-T: 调换光标两边的字符(transpose)

control-D: 删除光标右侧字符(delete)

control-K: 删除本行剩余的字符(kill)

control-L: 居中插入点到屏幕中央(lock)

SQLite Manager很棒的免费SQLite图形管理器

SQLite的命令行接口是很好用的,但是拥有一个图形界面管理器还是非常可心的事情。

本来是在SQLite自己的网站上苦苦查找免费工具,但是好东西却在Firefox的插件里。图片 2
看来评价还是蛮不错的,下载试试吧!
图片 3
图形界面是非常简单的,由于是基于Firefox的插件开发,该工具拥有跨平台的超级优势。对中文的支持也非常帮,英语好得朋友不妨试试。
图片 4

最棒的图解MVC

KiAnG自CS193P的笔记:

mvc_super

  • 控制器是螺丝,控制两头
  • 数据控件是硬盘,储存数据
  • 视图控件是界面,就是界面… …
  • 控制器接收视图的特定行为(target-action)和 代理通告(delegate)
  • 控制器视图接收数据的通知 和 KVO(键值观察)