前几章参考:
1-引言
2-Objective-C 编程
3-类、对象和方法
4-数据类型和表达式
5-循环结构
6-选择结构
7-类
8-继承
9-多态、动态类型和动态绑定
10-变量和数据类型
11-分类和协议
12-预处理程序
13-基本的C语言特性
14-Foundation框架简介
15-数字、字符串和集合
16-使用文件
内存管理关心的是清理(回收)不用的内存,以便内存能够再次利用。
提供给Objective-C程序员的基本内存管理模型有以下三种:
1)自动垃圾收集。(iOS运行环境并不支持垃圾收集,在这个平台开发程序时没有这方面的选项,只能用在Mac OS X 程序上开发。这个机制挺恶心的,用mac电脑的人知道,当内存不足的时候,机器基本上就是卡死了。)
2)手工引用计数和自动释放池。(这种方式,对程序员的要求很高。自己维护嘛,)
3)自动引用计数(ARC)。
手工内存管理规则的总结:
1)如果需要保持一个对象不被销毁,可以使用retain。在使用完对象后,需要使用release进行释放。
2)给对象发送release消息并不会必须销毁这个对象,只有当这个对象的引用计数减至0时,对象才会被销毁。然后系统会发送dealloc消息给这个对象用于释放它的内存。
3)对使用了retain或者copy、mutableCopy、alloc或new方法的任何对象,以及具有retain和copy特性的属性进行释放,需要覆盖dealloc方法,使得在对象被释放的时候能够释放这些实例变量。
4)在自动释放池被清空时,也会为自动释放的对象做些事情。系统每次都会在自动释放池被释放时发送release消息给池中的每个对象。如果池中的对象引用计数降为0,系统会发送dealloc消息销毁这个对象。
5)如果在方法中不再需要用到这个对象,但需要将其返回,可以给这个对象发送autorelease消息用以标记这个对象延迟释放。autorelease消息并不会影响到对象的引用计数。
6)当应用终止时,内存中的所有对象都会被释放,不论它们是否在自动释放池中。
7)当开发Cocoa或者iOS应用程序时,随着应用程序的运行,自动释放池会被创建和清空(每次的事件都会发生)。在这种情况下,如果要使自动释放池被清空后自动释放的对象还能够存在,对象需要使用retain方法,只要这些对象的引用计数大于发送autorelease消息的数量,就能够在池清理后生存下来。
自动引用计数(ARC):
强变量,通常,所有对象的指针变量都是强变量。
如果想声明强变量,可以使用__strong Faction *fl;这样的__strong来修饰。
值得注意的是,属性默认不是strong,其默认的特性是unsafe_unretained类似assign。所以需要声明属性strong时,可以如下:
@property (strong, nonatomic) NSMutableArray *birdNames;
编译器会保证在事件循环中通过对赋值执行保持操作强属性能够存活下来。带有unsafe_unretained(相当于assign)或weak的属性不会执行这些操作。
弱变量,可以使用__week关键字来声明。弱变量不能阻止引用的对象被销毁。当引用的对象释放时,弱变量会被自动设置为nil。
需要注意的是,在iOS4和Mac OS V10.6中不支持弱变量。在这种情况下,你仍然可以为属性使用unsafe_unretained, assing特性.
ARC都会在“底层”发生,所以一般不用关心。
最近在做移动端web开发
要在一个Ul 节点下添加一个li节点
ul代码如下
<ul id="AlarmList" data-role="listview" data-inset="true" data-theme="c" >
<li>
<a href="" rel="external" ><img src="/blog_article/images/GPS%E7%9B%91%E6%B5%8B%E7%AB%99.png" alt="GPS表面位移" /> <h3> GPS监测点1</h3>
<p><font color=red> X 偏移1m超出正常范围</font></p>
<p><font color=red> 安全级别:三级报警 请检查!</font></p>
</a>
</li>
<li>
<a href="" rel="external" ><img src="/blog_article/images/%E6%B8%97%E6%B5%81%E9%87%8F.png" alt="渗流量" />
<h3> 渗流量1</h3>
<p> <font color=red>流量:23 超出正常范围</font></p>
<p> <font color=red>安全级别:三级报警 请检查!</font></p>
</a>
</li>
<li>
<a href="" rel="external" ><img src="/blog_article/images/%E6%B5%B8%E6%B6%A6%E7%BA%BF.png" /> <h3> 浸润线2</h3>
<p><font color=red> 降深值3 超出正常范围</font></p>
<p><font color=red> 安全级别:危险 请检查!</font></p>
</a>
</li>
</ul>
我添加一个li节点
var str = "<li id=\"li1\"><a href=/index.html"\" rel=\"external\" font-style:normal\"><img src=/index.html"images/浸润线.png\" /><h3> GPS监测点1</h3><p><font color=red> X 偏移1m超出正常范围</font></p><p><font color=red> 安全级别:三级报警 请检查!</font></p></a></li>";
$("#AlarmList").append(str);
$("#li1 img").addClass("ui-li-icon");
但这样图片出不来啦,真的很纠结
效果如下
太难看啦
加上一行代码
$("#AlarmList").listview('refresh');
效果立马就出来啦
mainActivity如下:
package c.c;
import android.os.Bundle;
import android.view.View;
import android.view.ViewStub;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
/**
* Demo描述: 利用ViewStub显示和隐藏布局
* ViewStub的引入:
* 在开发的时候,有些布局是要根据条件而动态显示,达到一个布局两用的效果,
* 运用View.VISIBLE和View.GONE去改变布局的可见性.
* 这样的做法显然是没什么多大的问题,优点逻辑清晰,控制灵活,但缺点就是耗费资源
* 在setContentView()或者用inflate加载布局文件时无论View是否
* 被设置为View.GONE和View.VISIBLE,都会创建对象,占用一定程度上的内存,所以在考虑优化程序的时候,
* 尽量避免资源浪费,降低程序的资源占有量,提高响应速度,提升软件的用户体验
*
* 推荐的做法是使用android.view.ViewStub.
* ViewStub是一个轻量级的View,它一个看不见的,不占布局位置,占用资源非常小的控件.
* ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件当 ViewStub可见,或者调用
* inflate()函数时,才会加载这个布局资源文件 注意的问题: ViewStub只能用来Inflate一个布局文件,而不是某个具体的View
*
* 遇到的问题:
* 报错 ViewStub must have a non-null ViewGroup viewParent
* 原因:
* 官方文档:viewstub不能反复inflate,只能inflate一次
*
* 参考资料:
* http://blog.csdn.net/hitlion2008/article/details/6737537
*/
public class MainActivity extends Activity {
private Button mButton_show;
private Button mButton_hidden;
private ViewStub mViewStub;
private View mView=null;
private boolean isInflate=true;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init(){
mButton_show=(Button) findViewById(R.id.button_show);
mButton_show.setOnClickListener(new ButttonClickListenerImpl());
mButton_hidden=(Button) findViewById(R.id.button_hidden);
mButton_hidden.setOnClickListener(new ButttonClickListenerImpl());
mViewStub=(ViewStub) findViewById(R.id.viewStub);
}
private class ButttonClickListenerImpl implements OnClickListener {
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_show:
if (isInflate) {
mView=mViewStub.inflate();
isInflate=false;
}else {
mView.setVisibility(View.VISIBLE);
}
TextView textView=
(TextView) mView.findViewById(R.id.viewStub_TextView);
textView.setText("time="+System.currentTimeMillis());
break;
case R.id.button_hidden:
mViewStub.setVisibility(View.GONE);
break;
default:
break;
}
}
}
}
main.xml如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<ViewStub
android:id="@+id/viewStub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout="@layout/testviewstublayout"
/>
</LinearLayout>
<Button
android:id="@+id/button_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="加载ViewStub"
/>
<Button
android:id="@+id/button_hidden"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="隐藏ViewStub"
/>
</LinearLayout>
testviewstublayout.xml.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/viewStub_TextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="test test test"
/>
</LinearLayout>