一些知识点(静态量/setValure/动画...)
以下知识都是为个人转载他人文章
int a;
main()
{
while(1)
{
static b=1;
a=2;
b++;
a++;
}
}
我们所理解的静态变量b,只知道它在上面的函数内部只初始化一次,其实是个假像 ,我要表达的是,事实上b初始化的值,不是在循环体完成的.继续下看.
while(1)
{
static b=1;
a=2;
b++;
a++;
}
注意这一句:
static b=1;为什么我们循环体无限循环,b 他只会赋一次值呢,从C上面是看不出来的.
经过我反汇编发现,
static b=1; 根本不在循环体中.可以想像,程序被译成目标机器的时候是这个样子
while(1)
{
//static b=1; 这句没有!
a=2;
b++;
a++;
}
那么b是什么时候赋的值呢,是编译的时候就确定了。。就是说,编译的时候,就给b初始化好了!
类似,我们定义全局变量,如果不赋值,编译器给他赋上0.如果定义了值,就在编译的时候就确定下来了,这个值是编译器根据我们的语句赋给它的.而不程序中指令赋给它的!
那么这个 a,b变量都在哪呢,他们呆在所谓的静态存储区(后面有介绍),物理上整个程序中任意代码都能访问到这片区域,说明他们在存储上是一样的.但是a,b区别又在哪呢,就是对他们的引用,编译器,允许你任何地方,函数中调用a,而b,不行,他有局部作用域,比如你在一个函数中声明了静态变量b,那只能在这函数中调用b.如果在其它的地方调用它,编译器会报错.这就是逻辑上的控制,而实际上,"物理"上是允许程序在任意地方访问b变量,但是编译器哥哥不会让你访问.
那什么又叫静态存储区呢,我个人认为就是这是安全区域,不会随便被别的变量替掉.分给你的就是你的,不会被别人给占了.
谈到这里我们顺便提一下,我们其它函数的局部变量存在内存中的位置,局部变量存放在栈中,栈是一片特殊内存区域,多个变量可能共享使用这片区域,这里我们就可以看到一个问题,既然共享使用,假如我们声明一个局部变量,如果不赋初值,这个变量所在栈中的位置,这个位置包含的值,是随机的,是上次别的变量留下来的值.
以为为自己一些注释理解:
在swift中,在自己项目中使用static修饰方法,主要用在,这个方法会时常使用,且不存在类属性;即使有也是无效的;比如获取一个通知的名称;获取一个标示,都可以通过静态方法形式,在调用时解约资源;(虽然很小,个人还是秉承能节约就节约)。
在代码部分通过类直接引用;避免实例创建,节约内存;
公司封装的工具类中基本使用静态方法;这部分可以节约相当大的资源。
1, setObject:forkey:中value是不能够为nil的,不然会报错。
setValue:forKey:中value能够为nil,但是当value为nil的时候,会自动调用removeObject:forKey方法
2, setValue:forKey:中key的参数只能够是NSString类型,而setObject:forKey:的可以是任何类型
注意:setObject:forKey:对象不能存放nil要与下面的这种情况区分:
1, [imageDictionarysetObject:[NSNullnull] forKey:indexNumber];
[NSNull null]表示的是一个空对象,并不是nil,注意这点
2, setObject:forKey:中Key是NSNumber对象的时候,如下:
[imageDictionarysetObject:obj forKey:[NSNumber numberWithInt:10]];
在实现动画时
立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局
如果不标记可能产生后果:比如两个相邻的控件同时动画;不标记的情况下,两个控件在动画过程中可能出现断开现象;在自己的项目中就出现了;