收集的一些OC知识点

和自甴很熟 提交于 2020-04-04 09:01:46

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

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!