Apple的文档很清楚地说明了initialize和load的区别在于:load是只要类所在文件被引用就会被调用,而initialize是在类或 者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么 initialize也不会被调用。
http://www.cnblogs.com/ider/archive/2012/09/29/objective_c_load_vs_initialize.html
可以用于判断是否第一次启动。。。
android的抽屉效果有SlidingDrawer组件,主要作为菜单显示更多信息,节省屏幕空间。使用简单,用法如下:
1、在xml布局文件中,添加一个SlidingDrawer的标签,内嵌一个ImageView和一个ListView,其中ImageView用来做抽开抽屉的手柄,ListView的内容可以作为抽屉打开有显示的内容,xml如下:
<SlidingDrawer android:id="@+id/slidingdrawer" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:handle="@+id/hanler"<!--这里的handle很重要,就是下面的图片ID--> android:content="@+id/content"<!--这里的content很重要,就是下面的ListView--> > <ImageView android:id="@+id/hanler" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="/blog_article/@drawable/ic_launcher/index.html"/> <LinearLayout android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="wrap_content" ></LinearLayout> </SlidingDrawer>
2、在java代码中,主要做2件事:
一、给ListView设置数据源Adapter,这个不是SlidingDrawer必须的,然后把listView添加到抽屉组件中
二、给SlidingDrawer设置监听事件,有打开的、关闭、拖动
详细代码我都贴出来:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); drawer=(SlidingDrawer) findViewById(R.id.slidingdrawer); layout=(LinearLayout) findViewById(R.id.content); handler=(ImageView) findViewById(R.id.hanler); //创建listview listView=new ListView(this); //geilistview设置数据源Adapter listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,data)); layout.addView(listView); drawer.setOnDrawerOpenListener(new onDrawerOpenListenerImpl()); drawer.setOnDrawerCloseListener(new onDrawerCloseListenerImpl()); drawer.setOnDrawerScrollListener(new onDrawerScrollListenerImpl()); }
这个是抽屉的打开事件
private class onDrawerOpenListenerImpl implements OnDrawerOpenListener{ @Override public void onDrawerOpened() { Toast.makeText(MainActivity.this, "抽屉正在打开", Toast.LENGTH_SHORT).show(); } }
这个是抽屉的关闭事件
private class onDrawerCloseListenerImpl implements OnDrawerCloseListener{ @Override public void onDrawerClosed() { Toast.makeText(MainActivity.this, "抽屉关闭", Toast.LENGTH_SHORT).show(); } }
抽屉的拖动事件
private class onDrawerScrollListenerImpl implements OnDrawerScrollListener{ @Override public void onScrollEnded() { Toast.makeText(MainActivity.this, "抽屉拖动结束", Toast.LENGTH_SHORT).show(); } @Override public void onScrollStarted() { Toast.makeText(MainActivity.this, "抽屉正在拖动", Toast.LENGTH_SHORT).show(); } }
FPGA开发比较复杂,其中的重点是时序设计。关于复杂时序设计,其中重点中的重点就是时序分析,设计状态机。在设计状态机的过程中就将整体的时序在头脑中有一个大概的划分。状态转换,状态内部的时序设计。有个高手讲过一句话,我觉得是很有道理的。时序是设计出来的,不是仿真仿出来的。一个时序逻辑的设计,如果开始没有一个整体的规划。上来就开始写代码,只会陷你于万劫不复之境地。
逻辑时序设计要求你对整个系统有一个大的规划,对每个模块,接口进行科学的定义。整体逻辑模块的划分,将有助于对逻辑的分割。更加详细和细致的理解整个功能模块的设计原理和定义。首先是在稿纸上进行详细的设计,画出整体的框图。
在代码设计阶段,一定要求是根据你的原理设计框图进行代码设计。如果有修改,得在原理图上标明。代码设计阶段主要关注几个点。一个是代码的可综合性,还一个就是综合后寄存器路径是否过长,寄存器的扇入和扇出系数是否超过了器件的最大允许值,这些都将影响整个电路的设计性能。对于一般情况,综合一次对,一次不对,的情况都是因为设计的代码时序约束不过关。线延迟,建立保持时间不够等。这里可以引入一个设计方法,那就是用软件进行静态时序分析。对关键路径通过时序约束文件进行约束。对于时序报告文件中不能满足时序约束条件的关键路径进行电路的从新设计。
对于阻塞和非阻塞赋值是一个比较难理解的点,所谓阻塞赋值,带有延迟的赋值。非阻塞赋值,就是立即赋值。两个在出现结果的情况下面来讲,就是阻塞赋值在时钟沿过来了,是顺序执行的,而非阻塞赋值就是直接全部都并行执行。
在verilog中有两种方式进行位移,其中的第一方式就是"<<"," >>"左右移位,但是在实际设计过程中。我使用reg类型的数据变量没法移位,根据静态时序分析得出的结果是寄存器路径过长。后面修改为a={a,1‘b0}在实际工程中通过。说明在工程中位拼接指令能够更好的综合。