免费iPhone软件网
iPhone软件开发的生意越来越难作,反而成就了某些网站… …
免费iPhone软件网:freeappalert.com
简单而精品的网站介绍新近变为免费的iPhone软件,心动不如行动,看看有没有你想要的软件!
IPhone, Cocoa, PHP, Javascript, JQuery, Actionscript, etc…
Archive for 八月 2009
iPhone软件开发的生意越来越难作,反而成就了某些网站… …
免费iPhone软件网:freeappalert.com
简单而精品的网站介绍新近变为免费的iPhone软件,心动不如行动,看看有没有你想要的软件!
APress不久前出版了iPhone开发系列的新书《iPhone Cool Projects》, 该书分别以7位资深iPhone开发人员的几款软件为实例作为介绍。通过现实生活的例子来解释iPhone开发的过程,更贴近现实更贴近实战开发。
更多该书的英文信息可以查阅APress的主页:http://apress.com/book/view/9781430223573
如果对该书有兴趣,也可以去Google一下~
原来简单解释过属性定义(Property) ,并且提起了简单的retain,copy,assign的区别。那究竟是有什么区别呢?
assign就不用说了,因为基本上是为简单数据类型准备的,而不是NS对象们。
Retain vs. Copy!!
那上面的是什么该死的意思呢?
Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSString对象,地址为0×1111,内容为@”STR”
Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说,retain是指针拷贝,copy是内容拷贝。哇,比想象的简单多了…
错误:
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里面作这些事情就可以了
字符串是程序设计最常用的数据类型之一了。在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的愉快~
既然JSON这么好,它怎么和UITableView结合使用呢?
首先看看我们的JSON文件吧:
{
"老张家":["大张","二张","三张"],
"老李家":["大李","二李"]
}完成的作品是这样样子的~~(点击放大阿~~)
好,开始打代码吧。
1,首先copy JSON库到当前的Project里面。
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,编译运行,没有错误就万事大吉!大吉!
阿弥陀佛,祝各位愉快~
上一期基本上讨论了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
Three20,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库来试试阿!
没事也要换个心情,所以需要换换模板嘛。
在Smashing Mag上找到的模板大全,免费而且无敌的帅… 编程的还是用我这个简朴的Blocks吧