当前位置: 编程技术>移动开发
本页文章导读:
▪严苛的单例 苛刻的单例
作为设计模式中最简单的一个,单例模式还是在很多系统中都会用到,总有那么一些实例,从始至终只需要它的一个实例,而且任何时候都要总方便的得到,像 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 的三个实例,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
作为设计模式中最简单的一个,单例模式还是在很多系统中都会用到,总有那么一些实例,从始至终只需要它的一个实例,而且任何时候都要总方便的得到,像 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
最新技术文章: