我们可以吧设计模式,想象成一些物件之间的组合关系。就是当我们的APP或Library中有很多不同种类的物件是,我们怎么把这些物件组合合理的关系。
常见的一些设计模式
为什么要使用设计模式
- 学习设计模式就是学习工程师的语言,使用设计模式就是与其他工程师沟通,让其他参与人可以快速理解整个软件的架构。
- 维护一些有年纪的软件,使用设计模式则能让我们想要改动的时候还有办法改得动。
再谈Singleton
//避免多线程环境下,instance 可能会被多次建立
+ (instancetype) sharedInstance{
static MyClass *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[MyClass alloc]init];
});
return instance;
}
bool 与 BooL
//iOS64位系统 & AppleWatch:BooL会定义成stdbool里的bool,就是int (0,1);bool和BOOL没什么区别
//使用C++:stdbool里的bool会定义成C++的bool。
//iOS32系统 & Mac OS X:BooL会被定义成一个char,而 BooL 和 bool,就是1个byte与4个byte的区别。
//API 要求你传入BOOL时,那就传入 YES 或 NO。没什么非要传入 tru 或 false。
// BOOL - NSNumber @(YES),@(NO)
NSLog(@"YES: %ld",sizeof(YES)); //1
NSLog(@"true: %ld",sizeof(true)); //4
NSInteger 与 NSUInteger
严格来说 NSInteger 并不算是 Objective—C 的整数,它是
C语言的形态来代替数字的OC物件(包括NSNumber,NSDecimalNumber)
;NSInteger就是C的整数。
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
//在iOS64位,NSInteger 被定义为 long,32位被定义为 int。
//我们尽量使用NSInteger与NSUInteger,让编译器帮我们决定是32位还是64位整数。
//使用浮点数,尽量使用 CGFloat,一样会在不同环境下,被当成32位或64位浮点数。
NULL、nil、Nil...
在Objective-C语言中,有多个代表[ 空 ]的东西:
- NULL
- nil
- Nil
- NSNull
- NSNotFound
NULL 并不算是OC的东西,而是属于C语言。NULL就是
C语言的空指针
,指向0的指针。绝大多数情况下,nil、Nil与NULL可以代替使用,当某个API需要你传入指针(void*)时,而不是id类型是,虽然可以传入nil,但是传NULL意义比较清楚。
nil 是
空的OC物件的指针,也一样指向0
。如果我们建立了一个OC对象,当我们不需要这个对象的时候,便可以将它指向nil;我们可以对nil呼叫任何的OC method。
我们注意在 Array 与 Dictionary 中使用 nil 的情况。在传入参数是,最后一个参数一定是nil。
NSMutableArray 插入 nil 会 Crash。
NSArray *a = [NSArray arrayWithObjects:@1,@2,nil,@3, nil];
NSLog(@"a:%@",a); //a:(1,2)
nil 是
空的instance
,那 Nil 则是空的 class
。
Class cls = NSClassFromString(@"myclass");
if ( cls != Nil) {
// Do somethings
};
NSNull 不同于NULL、nil、Nil,NSNull是
确实存在的OC物件
。前面讲我们无法再array与dictionary中插入nil,可以使用插入[NSNull null]
这个物件来代表[空]
NSNotFound 表示
找不到这个东西的index
。比如我们在呼叫Array的indexOfObject:
或 String的rangOfString:
,当没有找到时,会返回NSNotFound。
NSNotFound 是整数的最大值。32位下最大值是2^31-1
,64位是2^63-1
。