当前位置:  编程技术>移动开发
本页文章导读:
    ▪严苛的单例        苛刻的单例 作为设计模式中最简单的一个,单例模式还是在很多系统中都会用到,总有那么一些实例,从始至终只需要它的一个实例,而且任何时候都要总方便的得到,像 Application 对象.........
    ▪ goolge 舆图地址位置解析        goolge 地图地址位置解析 Java代码package com.android.yibai.antking; import java.util.ArrayList; import java.util.List; import java.util.Locale; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; impor.........
    ▪ 手机专用网络设立       手机专用网络设置 0000000000000000000      ......

[1]严苛的单例
    来源: 互联网  发布时间: 2014-02-18
苛刻的单例
作为设计模式中最简单的一个,单例模式还是在很多系统中都会用到,总有那么一些实例,从始至终只需要它的一个实例,而且任何时候都要总方便的得到,像 Application 对象啦,环境对像啊。

要保持你设计的类别人只会初始出一个实例来,像 Java/C++/C# 中的做法一般希望能保证以下那些:

1. 构造方法藏起来,private 修饰,这样只能通过统一的工厂方法获得实例,因为 new 出来的总是新对象
2. 克隆方法出来的对象仍然是原来的对象
3. 反序列化出的对象也仍然是原来那个唯一的对象(这好像有点难)
4. 一般程序运行期间,该单实例不被释放
5. 一般要求工厂方法是原子性的,也是避免返回了不同的实例
6. 等等................. 是否还有些补充?

不一定每一点都真正考虑到,因为不是每个使用都都那么变态或不存在某些使用场景。

而我们这里的 Objective-C 有其语言的较大特殊性,是通过 alloc 来创建实例的,无法把构造方法 alloc 隐藏起来,但我们总是有办法的,可以做到:

1. 工厂方法返回唯一的实例
2. 多次调用 alloc 构造出的实例与 工厂方法得到的是同一个
3. 让你释放不掉这个实例,引用计数不让归零现在来看看 Objective-C 中的单例模式的代码实现吧:


//singleton.h
 
#import <Foundation/Foundation.h>
 
@interface Singleton : NSObject
{
 
}
 
+ (Singleton *) sharedInstance;
 
- (void) operation;
 
@end
 
//singleton.m
#import "Singleton.h"
 
@implementation Singleton
 
static Singleton *_sharedInstance = nil;
 
- (void) operation
{
  // do something
  NSLog(@"Singleton");
}
 
+ (Singleton *) sharedInstance
{
  if (_sharedInstance == nil)
  {
    _sharedInstance = [NSAllocateObject([self class], 0, NULL) init];
  }
  
  return _sharedInstance;
}
 
+ (id) allocWithZone:(NSZone *)zone
{
  return [[self sharedInstance] retain];
}
 
- (id) copyWithZone:(NSZone*)zone
{
  return self;
}
 
- (id) retain
{
  return self;
}
 
- (NSUInteger) retainCount
{
  return NSUIntegerMax; // denotes an object that cannot be released
}
 
- (oneway void) release
{
  // do nothing
}
 
- (id) autorelease
{
  return self;
}
 
@end


马上来看看效果,用下面的代码来分别得到 Singleton 的三个实例,s1, s2, s3:

 Singleton *s1 = [Singleton alloc];
    Singleton *s2 = [Singleton sharedInstance];
    Singleton *s3 = [Singleton alloc];
     
    NSLog(@"s1:%@, s2%@, s3%@", s1, s2, s3);


执行后打印出来的三个实例的地址是一样的:

s1:<Singleton: 0x100114890>, s2<Singleton: 0x100114890>, s3<Singleton: 0x100114890>

说明它们是同一个实例,无论是 alloc 还是 sharedInstance,好了现在对照着成功的案例可以放心的解释一下了:

1. 每一次 alloc 都得经过 allocWithZone: 方法,然后进到 sharedInstance 方法,这就统一了入口
2. release/autorelease/retainCount 方法保证了实例不被释放
3. copyWithZone: 和 retain 用以确保克隆还是保留的仍然是原来那个唯一的实例

再有更苛刻的条件就暂不考虑了,比如应该可以加上 @synchronized 来原子性一下。



from:http://unmi.cc/objective-c-dp-singleton

    
[2] goolge 舆图地址位置解析
    来源: 互联网  发布时间: 2014-02-18
goolge 地图地址位置解析

Java代码package com.android.yibai.antking;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

public class GeocoderMain extends MapActivity{
    //地图显示控制相关的变量定义
	private MapView map = null;
	private MapController mapCon;
	private Geocoder geo;
	private static final int ERROR_DIALOG=1;
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		geo= new Geocoder(this,Locale.CHINA);
		//获取MapView
		map = (MapView)this.findViewById(R.id.mapview);
		//设置显示模式
//		map.setTraffic(false);
//		map.setSatellite(true);
		//map.setStreetView(true);
		//设置可以缩放
		map.setBuiltInZoomControls(true);
		List addresses = null;
		try{
			addresses = geo.getFromLocationName("日照市万平口", 1);
			
			}catch(Exception e){
				e.printStackTrace();
			}
	   if(addresses.size()==0){
		   showDialog(ERROR_DIALOG);
		   GeoPoint geoBeijing = new GeoPoint(
				   39906033,116397700);
		   mapCon = map.getController();
		   mapCon.setCenter(geoBeijing);
		   mapCon.setZoom(4);
		   
	   }else{
		   Address address = (Address) addresses.get(0);
		   //设置初始地图的中心位置
		   GeoPoint geoPoint =new GeoPoint(
			(int)(address.getLatitude()*1E6),
			(int)(address.getLongitude()*1E6)
		   );
		   mapCon = map.getController();
		   mapCon.setCenter(geoPoint);
		   mapCon.setZoom(20);
		   List<Overlay> overlays = this.map.getOverlays();
		   PositionOverlay overlay = new PositionOverlay(geoPoint,this,R.drawable.icon);
		   overlays.add(overlay);
		  
		   
	   }
	}
	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
	protected Dialog onCreateDialog(int id){
		return new AlertDialog.Builder(this).setTitle("查询出错了")
		.setMessage("地名出错,请从新输入").create();
	}
	class PositionOverlay extends Overlay{
		private GeoPoint geoPoint;
		private Context context;
		private int drawable;
		public PositionOverlay(GeoPoint geoPoint,Context context,int drawable){
			super();
			this.geoPoint = geoPoint;
			this.context = context;
			this.drawable = drawable;
			
		}
		public void draw(Canvas canvas,MapView mapView,boolean shadow){
			Projection projection = mapView.getProjection();
			Point point = new Point();
			projection.toPixels(geoPoint, point);
			Bitmap bitmap =BitmapFactory.decodeResource(context.getResources(), drawable);
			canvas.drawBitmap(bitmap, (point.x-bitmap.getWidth()/2), (point.y-bitmap.getHeight()),new Paint());
			super.draw(canvas, mapView, shadow);
		}
	}

}
 

    
[3] 手机专用网络设立
    来源: 互联网  发布时间: 2014-02-18
手机专用网络设置

0000000000000000000




 

 

 

    
最新技术文章:
▪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