收集的一些OC知识点
bool 即是 signed char,在iphone64位是unsigned char。
单例模式在c++和java都有,一般是需要一个不释放的对象,在创建时需要注意多线程的问题,使用synchronized(self)加锁,retainCount使用一个无限制大的数
,需要重写retain和autorelease,release等函数。
属性:
The @property is an Objective-C directive which declares the property. The "retain" in the parenthesis specifies that the setter should retain the input value.
在属性的setter中会retain一下对象
比如:
@property (nonatomic, retain) NSString *s01;
self.s01 = stringObject; 这个时候stringObject的retainCount会加1;
如果用_s01 = stringObject则stringObject的retainCount不会加1。
OC中的nil是空对象,调用任一方法都不会导致崩溃,所以对象最后释放的时候置为nil可以保证程序的稳定。
cocos2d的一些概念
有ccsence, ccdirector, cclayer, ccsprite
其中sence是场景,游戏由各个场景构成,如第一关,第二关,还有中间的过渡场景;
director负责场景直接的切换,是一个单例模式;
layer相当于层,一个场景中可以包含好几层,就是有好几个layer,每个layer上面可以放sprite精灵
sprite精灵,每个控件都是精灵,是游戏的最基本单位,相当于uiview,可以给sprite添加action。
cocos2d中的地图编辑器叫tileMap
一个通过wifi连接的游戏例子gameKit http://www.cocoachina.com/bbs/read.php?tid-16732.html
IOS中的线程池
跟java中的ThreadPoolExecutor差不多,都是生成n个线程放在那里,不一定马上执行任务,在需要的时候从线程池中取出线程,加入任务,这样节省了每次创建线程需要的资源。
IOS的线程池是使用NSOperationQueue实现,每个任务是NSOperation,在NSOperationQueue中添加NSOperation,系统就会执行NSOperation的- (void)main函数的内容
例子代码如下:
1 NSOperationQueue *threadPool = [[NSOperationQueue alloc] init]; 2 int maxThreadCount = 4; 3 [threadPool setMaxConcurrentOperationCount:maxThreadCount]; 4 for (int i=0; i<maxThreadCount; i++) { 5 //create thread 6 7 NSLog(@"start addding operation. task %d", i); 8 ThreadTask *task = [[ThreadTask alloc] init]; 9 [threadPool addOperation:task]; 10 11 }
其中的ThreadTask是NSOperation的子类,重写了- (void)main内容
ThreadTask.h
#import <Foundation/Foundation.h> @interface ThreadTask : NSOperation @end
ThreadTask.m
#import "ThreadTask.h" @implementation ThreadTask - (void)main { NSLog(@"execute task."); } @end
NSString *text = @"this is test code.";
@"this is test code."是有效常量。
使用[UIImage imageName:@"']方法获取的图片在内存中由系统cache管理,在同一页面中加入多个使用同一个图片的UIImage对象不会增加内存。
比如:
UIImage *img01 = [UIImage imageName:@"001.png"];
UIImage *img02 = [UIImage imageName:@"001.png"];
UIImage *img03 = [UIImage imageName:@"001.png"];
只是占用了一份内存,不是3份内存空间。
如果要将NSArray内容写入到文件中,可以用下面这个接口:
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
同时需要注意NSArray中的对象必须是Foundation的类,ex:NSString/NSData/NSUrl等
如果是自定义的类,调用WriteToFile会返回失败结果。
这个跟Object的Copy是一样的,NSArray *arr01 = [NSArray alloc] initWithObject:@"1",@"2",@"3",nil];
NSarray *arr02 = [arr01 copy];
这样没有问题。如果是自定义的类,调用copy则只是复制了指针,没有创建新的对应,生成对应的空间。
遍历队列时如果要删除队列成员的时候需要小心,容易引起崩溃
比如:
1 for (NSString *str in arrayWords) { 2 if ([str isEqualToString:@"2"]) { 3 [arrayWords removeObject:str]; 4 } 5 }
这样会引起崩溃,因为arrayWords的长度发生了变化,最后会找不到对应位置的成员对象。
解决这个问题可以在删除后立即跳出循环,或者跳出循环后再删除成员对象。
NSUserDefault是缓存在内存中的,不是每次都从数据库中读取数据,所以查询起来速度很快。调用synchronize方法后会同步内存和数据库的内容。
原文如下:
At runtime, you use an NSUserDefaults object to read the defaults that your application uses from a user’s defaults database. NSUserDefaults caches the information to avoid having to open the user’s defaults database each time you need a default value. The synchronize method, which is automatically invoked at periodic intervals, keeps the in-memory cache in sync with a user’s defaults database.
xcode调试APP的几个技巧
http://www.cocoachina.com/newbie/env/2014/0526/8555.html
xcode工程中使用了boost库导致产生很多warning的解决方法:
设置 Symbols Hidden by Default = YES
和 inline methods hidden = YES