还是换回原来的主题了,Apple风格的那个主题在显示上还是有不少问题。Objective-C接触了2个多星期,写一下上手体验。
内存管理初体验
最近看了看objective-c,主要是要理解好objective-c的内存管理机制,其他的和c/c++差别就不大了。虽然objective-c 2.0提供了gc,但是要写出高效的程序当然要靠自己去管理好内存,特别是在移动设备上。在接触内存管理的时候google了几篇文章,都说得不清楚,后来看了看官方的文档,才在使用上有了比较清晰的理解。其实归根结底是理解下面这2种初始化的区别:(以NSString为例)
NSString *string1 = [[NSString alloc] initWithString:@"Hello World!"]; NSString *string2 = [NSString stringWithString:@"Hello World!"];
string1是需要自己调用release(和创建在同一作用域释放)或者autorelease(string1作为函数返回值的时候),因为用alloc创建的对象是说明一种拥有关系(own,即retain count相应为加1,copy/retain也是),而string2则不是拥有关系,则自己不用调用release。因此,@property中的三个属性,assign/retain/copy也就更好理解了。
- assign是弱引用,retain count不变化;
- retain就是强引用,声明拥有关系,retain count加1;
- copy就是拷贝新的对象并引用到拷贝上。
而内存池(autoreleasepool),我总觉得是为了string2这种创建对象的方法和string1作为返回值的场合而存在的。
- 因为对于string2这样的创建对象方法,其实也就是在initWithString之后再调用一次autorelease而已;
- 而在string1作为返回值的场合,不能release了再返回也不能返回了再release,所以需要托管给内存池来管理。
而在Cocoa在每一个事件循环的生命周期都保证会有一个内存池创建和销毁,这样对象的管理机制就完美了。
Objective-C不难用
因为使用python习惯了,一下写回c,就像回到了原始社会一样。用了几天才发现,其实Objective-C在Foundation框架上提供了很多相当方便的类以及类的方法,足以让我找回写python的那种方便性。比如简单地从网上抓取一个文本文件存为字符串:
NSURL *url = [[NSURL alloc] initWithString:addr];
NSString *content = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:NULL];
[url release];
很简单,世上不是缺少美,而是缺少发现美的眼光。当然,想折腾或者获取更具体的连接信息也可以使用NSURLRequest和NSURLConnection。
Vim还是Xcode?
用了快2个星期Xcode,我已经很不习惯这样有GUI的IDE了,于是用回了Vi来写,目前只是写了几个简单的Mac OS的程序,因此用Vi写返而更顺手,在生成的时候使用xcodebuild命令:
xcodebuild -configuration Debug #默认是Release的
由于调试是使用NSLog这种打log的方式,所以还没有使用gdb。不过这样输出的错误信息也是很详细的,并不比Xcode来得麻烦。目前发现有个不方便的地方就是添加文件,是需要在Xcode上添加的,似乎要在工程的信息文件里增加新文件的信息,不然build的时候会出现新文件没被加进项目的错误。
Mac的开发资料实在是少,国内的网上书店都没有怎么引进,倒是iPhone的开发资料多。