Archive for 八月 2009

免费iPhone软件网

iPhone软件开发的生意越来越难作,反而成就了某些网站… …

免费iPhone软件网:freeappalert.com

简单而精品的网站介绍新近变为免费的iPhone软件,心动不如行动,看看有没有你想要的软件!

iPhone开发新书:iPhone Cool Projects

APress不久前出版了iPhone开发系列的新书《iPhone Cool Projects》, 该书分别以7位资深iPhone开发人员的几款软件为实例作为介绍。通过现实生活的例子来解释iPhone开发的过程,更贴近现实更贴近实战开发。

9781430223573我个人很喜欢那个火龙果~ 正如iPhone开发一样香甜诱人

更多该书的英文信息可以查阅APress的主页:http://apress.com/book/view/9781430223573

如果对该书有兴趣,也可以去Google一下~

retain和copy的区别

原来简单解释过属性定义(Property) ,并且提起了简单的retain,copy,assign的区别。那究竟是有什么区别呢?

assign就不用说了,因为基本上是为简单数据类型准备的,而不是NS对象们。

Retain vs. Copy!!

  • copy: 建立一个索引计数为1的对象,然后释放旧对象
  • retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

那上面的是什么该死的意思呢?

Copy其实是建立了一个相同的对象,而retain不是:

比如一个NSString对象,地址为0×1111,内容为@”STR”

Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化

retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1

也就是说,retain是指针拷贝,copy是内容拷贝。哇,比想象的简单多了…

在iPhone上显示LCD效果

我看到一个程序是这样样子的:

屏幕快照 2009-08-13 下午12.36.21

哇!好厉害,怎么弄出来的!难道要用Q2D画出来么?

不… …

其实这就是UILabel外加一个奇异的字体 DBLCDTempBlack

And, that’s it! 生活多么美好阿~

不要对viewController作这样的事情

错误:

UIViewController *aViewController = [[UIViewController alloc] init];
 
[window addSubview:aViewController.view];
 
[aViewController release];

这样的话,系统会崩溃的… window或着其他父视图是不会retain整个viewController的,这个时候不能立刻release

正确:

[aViewController.view removeFromSuperview];
 
[aViewController release];

也就是说,在release之前需要从superview中移除这个viewController的view。如果一直都需要这个view,那就在dealloc里面作这些事情就可以了

数据类型/对象类型介绍(1)NSString

字符串是程序设计最常用的数据类型之一了。在Mac/iPhone编程中,苹果为我们提供了一个不同的字符串类型NSString。有别与普通的String为数据类型,NSString其实是一个对象类型。NSString是NSObject(Cocoa Foundation的基础对象)的子类,所以具有NSObject的所有特性,好的和好的… ….

小常识:
NS是Cocoa类对象类型的前缀,来源于史蒂夫-乔布斯被苹果开除那段时间建立的公司NeXT.
@是Cocoa元素的前缀,很多地方我们会看到,比如接下来...

1, 创建一个NSString对象

简单方法:

NSString *aString = @"我是个NS字符串!";  //除了引号外加@, 没别的区别

*上面的不需要操心内存管理哟~

复杂一点儿:(需要内存管理的)

NSString *aString = [[NSString alloc] initWithFormat:@"这也是个NS字符串!"];

*initWithFormat是其中一个初始化方法,常用的还有

//从一个文件读取需要的内容
- (id)initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error
//从一个地址读取需要的内容
- (id)initWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error

*以上方法得到的NSString的retain值为1,所以记得release掉阿~~

2,使用一个NSString对象

NSString *aString = @"This is a NSString";
 
NSLog(aString);   //在控制台输出信息,该函数方法需要一个NSString对象作为参数
 
NSLog("这样不会好使的");
 
NSLog(@"这样就会好使拉~");

再比如设置一个UIView的标题:

[UIView setTitle:aString];
 
[UIView setTitle:@"标题"];
 
UIView.title = aString;

3,释放NSString

[aString release]; //对象将被系统释放掉咯

*记得不要释放直接用 = @”xxx” 的NSString对象哟,系统会管的~

4,快速使用一个NSString

NSLog([NSString stringWithFormat:@"一个NS字符串"]);

//这种快速方法返回的是一个retain为1,autorelease的对象,不需要操心它的内存管理

5,常用方法

我喜欢NSString的地方就在于很多方法非常方便,比如:

nString = [aString substringToIndex:4]; //nString将得到aString中的前四个字符

6,小结

暂时能记起来的就这么些了,有机会再补充,希望大家NS的愉快~

iPhone上的JSON(三)JSON+UITableView

既然JSON这么好,它怎么和UITableView结合使用呢?

首先看看我们的JSON文件吧:

{
	"老张家":["大张","二张","三张"],
	"老李家":["大李","二李"]
}

完成的作品是这样样子的~~(点击放大阿~~)

屏幕快照 2009-08-10 下午02.38.49

好,开始打代码吧。

1,首先copy JSON库到当前的Project里面。

屏幕快照 2009-08-10 下午02.50.52

2,建立一个数据源类。我给它起名叫MyDataSource, 看看里面都有什么吧:

@interface MyDataSource : NSObject {}
+ (id)dataSource;
@end
 
#import "JSON.h"
 
@implementation MyDataSource
+ (id)dataSource
{
	NSString* JSONString = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"]
							 encoding:NSUTF8StringEncoding error:nil];
	return [JSONString JSONValue];
}
@end

里面非常简单,只有一个类方法dataSource。在其中我们读取json文件的内容到一个NSString中,并用JSON框架来解读成一个NSDictionary,返回值为id。因为虽然大多的时候最外的对象都为NSDictionary,但是出于严谨,万一是NSArray不就崩溃了。所以使用id,这样其实就有再次可以用的特性了。

3,建立一个UITableViewController, 然后作适当的设置:

#import "MyTableViewController.h"
#import "MyDataSource.h"
 
@implementation MyTableViewController
 
- (id)initWithStyle:(UITableViewStyle)style
{
	if (self = [super initWithStyle:style]) {
		myData = [[MyDataSource dataSource] retain];
		//在这里我们初始化myData,其实就是一个id对象
		//传入由MyDataSource解析出的NSDictionary
	}
	return self;
}
 
#pragma mark Table view methods
 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [myData count];    //有多少个section,也就是“几家”
}
 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [[myData valueForKey:[[myData allKeys] objectAtIndex:section]] count];
//这里我们需要告诉UITableViewController每个section里面有几个,也就是“一家里面有几口人”
}
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 
    static NSString *CellIdentifier = @"Cell";
 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                                reuseIdentifier:CellIdentifier] autorelease];
    }
   //上面的东西都是重复白给的,平时没事不用想为什么,照抄就可以了
	cell.textLabel.text = [[myData valueForKey:[[myData allKeys] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
	//这句看上去复杂,但是其实不过是在特定section里面找到对应的array,
	//然后在array中找到indexPath.row所在的内容
    return cell;
}
 
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
	return [[myData allKeys] objectAtIndex:section];
//这里设置对应section的名字,很简单allKey返回所有的键值为一个array,也就是“张家”,“李家”
//然后用objectAtIndex: 来找出究竟是哪一个就可以了!
}
 
- (void)dealloc {
    [myData release]; //“我们是runtime的好市民”...release就好Alan......
    [super dealloc];
}
@end

4,在主程序代理 xxxAppDelegate 里面初始化这个UITableViewController然后添加它的view到window的subview中就OK拉!

5,编译运行,没有错误就万事大吉!大吉!

阿弥陀佛,祝各位愉快~


第一期请参看iPhone上的JSON
第二期请参看iPhone上的JSON(二)

iPhone上的JSON(二)

上一期基本上讨论了Objc的JSON框架的原理,现在简单介绍一下使用。

在CS193P的课堂程序上,列出了以下函数:

+ (id)fetchJSONValueForURL:(NSURL *)url
{
    NSString *jsonString = [[NSString alloc] initWithContentsOfURL:url
                                                          encoding:NSUTF8StringEncoding error:nil];
 
    id jsonValue = [jsonString JSONValue];
    [jsonString release];
    return jsonValue;
}

基本上这个函数方法就是将一个传入的互联网地址,当然是一个.json文件的位置。然后传出的就是一个NSDictionary~

我在使用的时候,写了一个方法来调用它:

+ (NSDictionary *)fetchLibraryInformation
{
    NSString *urlString = [NSString stringWithFormat:@"http://gzl.name/appData/MyFodian/Lib/main.json"];
    NSURL *url = [NSURL URLWithString:urlString];
	NSLog(@"fetching library data");
    return [self fetchJSONValueForURL:url];
}

这个方法不过是将我存放json文件的地址告诉了前面的方法,然后返回这个NSDictionary,这回的返回值我用得NSDictionary,其实和id在这里没有区别。记得在使用这个对象的时候还要retain一下,否则一会儿就没有咯。因为JSONValue方法返回的应该是一个autorelease对象。

接下来我们就可以使用这个NSDictionary中的数据拉!

第一期请参看iPhone上的JSON

TTView的简单使用

屏幕快照 2009-08-10 上午11.11.26Three20,320库真是好的不得了,都不知道该怎么夸它了,我在自己的佛历View中就使用了其中一个TTView,非常漂亮简单的风格。再也不用考虑是不是在UILabel下面放一个UIImageView等等… 而且还要自己弄图片的大小

在TTCatalog中展示了14种TTView的style,不知道你喜欢哪一个呢?

**我想我用的是第二个吧~

/*******************************************************************/

看看我的代码吧~

UIColor* blue = RGBCOLOR(191, 197, 208);
TTStyle *myStyle = [TTShapeStyle styleWithShape:[TTRoundedRectangleShape shapeWithRadius:10]
next:[TTShadowStyle styleWithColor:RGBACOLOR(255,255,255,0.9) blur:1 offset:CGSizeMake(0, 1)
next:[TTLinearGradientFillStyle styleWithColor1:RGBCOLOR(255, 255, 255)
		color2:RGBCOLOR(216, 221, 231)
next:[TTSolidBorderStyle styleWithColor:blue width:1 next:nil]]]];
 
viewA = [[[TTView alloc] initWithFrame:CGRectMake(10, 220, 300, 40)] autorelease];
viewB = [[[TTView alloc] initWithFrame:CGRectMake(10, 263, 300, 40)] autorelease];
viewC = [[[TTView alloc] initWithFrame:CGRectMake(10, 306, 300, 100)] autorelease];
viewA.backgroundColor = self.view.backgroundColor;
viewB.backgroundColor = self.view.backgroundColor;
viewC.backgroundColor = self.view.backgroundColor;
viewA.style = myStyle;
viewB.style = myStyle;
viewC.style = myStyle;
[self.view addSubview:viewA];
[self.view addSubview:viewB];
[self.view addSubview:viewC];

我一共需要三个框子,而style那个部分其实是完全照抄TTCatalog的(人懒也不是罪过)

但是需要注意一下事项:

1,必须要设置self的backgroundColor, 然后再赋值给TTView, 否则缺省值会变成黑色…
2, 记得release掉那些TTView,我使用的autorelease,因为superView会retain那些对象的~
3,在使用UILabel的时候,如果想设置UILabel为透明,只需要设置UILabel.backgroundColor为[UIColor clearColor]就可以拉,这样就不会让UILabel弄出一个窟窿来咯~

快去下载320库来试试阿!

100个超帅的WordPress模板

没事也要换个心情,所以需要换换模板嘛。

在Smashing Mag上找到的模板大全,免费而且无敌的帅… 编程的还是用我这个简朴的Blocks吧

>>>>点此查看100个超帅Wordpress模板<<<<

屏幕快照 2009-08-10 上午11.07.26