当前位置:  编程技术>移动开发
本页文章导读:
    ▪17-内存储器管理和自动引用计数        17-内存管理和自动引用计数 前几章参考: 1-引言 2-Objective-C 编程 3-类、对象和方法 4-数据类型和表达式 5-循环结构 6-选择结构 7-类 8-继承 9-多态、动态类型和动态绑定 10-变量和数据.........
    ▪ jquery Mobile 框架上添加新的Dom元素        jquery Mobile 框架下添加新的Dom元素最近在做移动端web开发 要在一个Ul 节点下添加一个li节点 ul代码如下 <ul   id="AlarmList"  data-role="listview" data-inset="true" data-theme="c" >      <li>     .........
    ▪ ViewStub的应用示例       ViewStub的使用示例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 a.........

[1]17-内存储器管理和自动引用计数
    来源: 互联网  发布时间: 2014-02-18
17-内存管理和自动引用计数

前几章参考:

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都会在“底层”发生,所以一般不用关心。




    
[2] jquery Mobile 框架上添加新的Dom元素
    来源: 互联网  发布时间: 2014-02-18
jquery Mobile 框架下添加新的Dom元素

最近在做移动端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>&nbsp;&nbsp;GPS监测点1</h3>
                        <p><font color=red>&nbsp;&nbsp;&nbsp;X 偏移1m超出正常范围</font></p>
                        <p><font color=red>&nbsp;&nbsp;&nbsp;安全级别:三级报警  请检查!</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>&nbsp;&nbsp;渗流量1</h3>
                        <p>&nbsp;&nbsp;&nbsp;<font color=red>流量:23 超出正常范围</font></p>
                        <p>&nbsp;&nbsp;&nbsp;<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>&nbsp;&nbsp;浸润线2</h3>
                        <p><font color=red>&nbsp;&nbsp;&nbsp;降深值3 超出正常范围</font></p>
                        <p><font color=red>&nbsp;&nbsp;&nbsp;安全级别:危险 请检查!</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');

效果立马就出来啦




    
[3] ViewStub的应用示例
    来源: 互联网  发布时间: 2014-02-18
ViewStub的使用示例

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>



 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3