NSInteger,int,long
在32位系统中int 占4个字节 ,long 占4个字节 ,long long 占8个字节
在64位系统中int 占4个字节 ,long 占8个字节 ,long long 占8个字节
int32_t 是int的别名,占4个字节 。int64_t 是long long的别名,占8个字节
NSInteger 的实现:
#if __LP64__
typedef long NSInteger;
#else
typedef int NSInteger;
#endif
NSInteger可以自动判断,如果是32位的架构,它就用int,如果是64位,它就用long。
int、long、long long
unsigned int 0~4294967295
int 2147483648~2147483647
unsigned long 0~4294967295
long 2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
- Int 类型的变量只能用于保存整型值,也就是不包含小数位数的值
- float 类型的变量可以存储浮点数
- double 和 char 类型一样,前者范围大约是后者的两倍。char 类型可以存储单个字符
- char charVar = ‘a’
- float 类型的变量可以存储包含小数位的值
- 限定词 long 、longlong、short、unsigned、signed
- long变量的具体范围也可以由具体的计算机系统决定 %li 将用十进制显示 long int 的值
- 如果把限定词long放在int 声明前,那声明的整型变量在某些计算机上具有扩展的值域
- 如果把限定词short放在int 声明前,表示声明特定的变量来存储相当小的整数 (用short是对内存空间的考虑,可以节约空间)
- unsigned 放在 int 前,表示存储的是正数的整数变量
- id 类型可以存储任何类型的对象,是多态和动态绑定的基础
关键字static有什么作用?
-
函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。
关键字const有什么含意?修饰类呢?
const 意味着"只读",下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
结论:
关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。
欲阻止一个变量被改变,可以使用 const 关键字。在定义该 const 变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指定为 const;
在一个函数声明中,const 可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
对于类的成员函数,若指定其为 const 类型,则表明其是一个常函数,不能修改类的成员变量;
对于类的成员函数,有时候必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
@synthesize和@dynamic分别有什么作用?
@property有两个对应的词,一个是 @synthesize,一个是 @dynamic。如果 @synthesize和 @dynamic都没写,那么默认的就是@syntheszie var = _var;
@synthesize 的语义是如果你没有手动实现 setter 方法和 getter 方法,那么编译器会自动为你加上这两个方法。
@dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。(当然对于 readonly 的属性只需提供 getter 即可)。假如一个属性被声明为 @dynamic var,然后你没有提供 @setter方法和 @getter 方法,编译的时候没问题,但是当程序运行到 instance.var = someVar
,由于缺 setter 方法会导致程序崩溃;或者当运行到 someVar = var
时,由于缺 getter 方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。