当前位置:  编程技术>移动开发
本页文章导读:
    ▪[Cocoa]XCode的一些调试技艺        [Cocoa]XCode的一些调试技巧 From: http://blog.csdn.net/kesalin/article/details/7222153 XCode 内置GDB,我们可以在命令行中使用 GDB 命令来调试我们的程序。下面将介绍一些常用的命令以及调试技巧。 po 命.........
    ▪ 高德舆图GPS定位        高德地图GPS定位 package com.cjy.map; import com.autonavi.mapapi.GeoPoint;import com.autonavi.mapapi.LocationManagerProxy;import com.autonavi.mapapi.LocationProviderProxy;import com.autonavi.mapapi.MapActivity;import com.autonavi.mapapi.MapContro.........
    ▪ ViewGroup格局       ViewGroup布局   viewgroup简单说就是可以装view的view.今天遇到一个问题,就是需要一个可以自动根据一行中view的宽度自动换行的布局,网上找了下,没有相关的例子,但是找到了思路:自定义.........

[1][Cocoa]XCode的一些调试技艺
    来源: 互联网  发布时间: 2014-02-18
[Cocoa]XCode的一些调试技巧

From: http://blog.csdn.net/kesalin/article/details/7222153

XCode 内置GDB,我们可以在命令行中使用 GDB 命令来调试我们的程序。下面将介绍一些常用的命令以及调试技巧。

po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 description 消息获得的字符串信息)。

比如:

上图中,我使用 po 命令显示一个 NSDictionary 的内容。注意在左侧我们可以看到 dict 的一些信息:3 key/value pairs,显示该 dict 包含的数据量,而展开的信息显示 isa 层次体系(即class 和 metaclass结构关系)。我们可以右击左侧的 dict,选中“Print Description of "dict"”,则可以在控制台输出 dict 的详细信息:

[cpp] view plaincopyprint?
  • Printing description of dict:  
  • <CFBasicHash 0x1001149e0 [0x7fff7e27ff40]>{type = immutable dict, count = 3,  
  • entries =>  
  •     0 : <CFString 0x100002458 [0x7fff7e27ff40]>{contents = "first"} = <CFString 0x100002438 [0x7fff7e27ff40]>{contents = "one"}  
  •     1 : <CFString 0x100002498 [0x7fff7e27ff40]>{contents = "second"} = <CFString 0x100002478 [0x7fff7e27ff40]>{contents = "two"}  
  •     2 : <CFString 0x1000024d8 [0x7fff7e27ff40]>{contents = "third"} = <CFString 0x1000024b8 [0x7fff7e27ff40]>{contents = "three"}  
  • }  
  • (gdb)   

  • print 命令:有点类似于格式化输出,可以输出对象的不同信息:

    如:

    [cpp] view plaincopyprint?
  • (gdb) print (char *)[[dict description] cStringUsingEncoding:4]  
  • $1 = 0x1001159c0 "{\n    first = one;\n    second = two;\n    third = three;\n}"  
  • (gdb) print (int)[dict retainCount]  
  • $2 = 1  
  • (gdb)   
  •  

    注:4是 NSUTF8StringEncoding 的值。

    info 命令:我们可以查看内存地址所在信息

    比如 "info symbol 内存地址" 可以获取内存地址所在的 symbol 相关信息:

    [cpp] view plaincopyprint?
  • (gdb) info symbol 0x00000001000017f7  
  • main + 343 in section LC_SEGMENT.__TEXT.__text of /Users/LuoZhaohui/Library/Developer/Xcode/DerivedData/RunTimeSystem-anzdlhiwvlbizpfureuvenvmatnp/Build/Products/Debug/RunTimeSystem  
  •  

    比如 "info line *内存地址" 可以获取内存地址所在的代码行相关信息:

     

    [cpp] view plaincopyprint?
  • (gdb) info line *0x00000001000017f7  
  • Line 62 of "/Users/LuoZhaohui/Documents/Study/RunTimeSystem/RunTimeSystem/main.m" starts at address 0x1000017f7 <main+343> and ends at 0x10000180a <main+362>.  
  •  

    show 命令:显示 GDB 相关的信息。如:show version 显示GDB版本信息

    [cpp] view plaincopyprint?
  • (gdb) show version  
  • GNU gdb 6.3.50-20050815 (Apple version gdb-1708) (Mon Aug  8 20:32:45 UTC 2011)  
  • Copyright 2004 Free Software Foundation, Inc.  
  • GDB is free software, covered by the GNU General Public License, and you are  
  • welcome to change it and/or distribute copies of it under certain conditions.  
  • Type "show copying" to see the conditions.  
  • There is absolutely no warranty for GDB.  Type "show warranty" for details.  
  • This GDB was configured as "x86_64-apple-darwin".  

  • help 命令:如果忘记某条命令的语法了,可以使用 help 命令名 来获取帮助信息。如:help info 显示 info 命令的用法。
    [cpp] view plaincopyprint?
  • (gdb) help info  
  • Generic command for showing things about the program being debugged.  
  •   
  • List of info subcommands:  
  •   
  • info address -- Describe where symbol SYM is stored  
  • info all-registers -- List of all registers and their contents  
  • info args -- Argument variables of current stack frame  
  • info auxv -- Display the inferior's auxiliary vector  
  • info breakpoints -- Status of user-settable breakpoints  
  • info catch -- Exceptions that can be caught in the current stack frame  
  • info checkpoints -- Help  
  • info classes -- All Objective-C classes  
  • ......  
  •   
  • Type "help info" followed by info subcommand name for full documentation.  
  • Command name abbreviations are allowed if unambiguous.  
  • (gdb)   
  • 在系统抛出异常处设置断点

    有时候我们的程序不知道跑到哪个地方就 crash 了,而 crash 又很难重现。保守的做法是在系统抛出异常之前设置断点,具体来说是在 objc_exception_throw处设置断点。设置步骤为:首先在 XCode 按 CMD + 6,进入断点管理窗口;然后点击右下方的 +,增加新的 Symbolic Breakpoint,在 Symbol 一栏输入:objc_exception_throw,然后点击 done,完成。 这样在 Debug 模式下,如果程序即将抛出异常,就能在抛出异常处中断了。比如在前面的代码中,我让 [firstObjctcrashTest]; 抛出异常。在 objc_exception_throw 处设置断点之后,程序就能在该代码处中断了,我们从而知道代码在什么地方出问题了。


        
    [2] 高德舆图GPS定位
        来源: 互联网  发布时间: 2014-02-18
    高德地图GPS定位

    package com.cjy.map;

    import com.autonavi.mapapi.GeoPoint;
    import com.autonavi.mapapi.LocationManagerProxy;
    import com.autonavi.mapapi.LocationProviderProxy;
    import com.autonavi.mapapi.MapActivity;
    import com.autonavi.mapapi.MapController;
    import com.autonavi.mapapi.MapView;
    import com.autonavi.mapapi.MyLocationOverlay;

    import android.content.Context;
    //
    //import android.location.Location;
    //import android.location.LocationListener;
    //import android.location.LocationManager;
    import android.location.Location;
    import android.location.LocationListener;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    import android.widget.Toast;

    public class MapGdActivity extends MapActivity {
     /** Called when the activity is first created. */
     MapView map = null;
     MapController ctrlMap = null;
     MyLocationOverlay mylocTest;
     GeoPoint point;

     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      map = (MapView) findViewById(R.id.mylocationview);
      map.setBuiltInZoomControls(true); //
      ctrlMap = map.getController();
      // 得到mMapView的控制权,可以用它控制和驱动平移和缩放
      point = new GeoPoint((int) (34.299999 * 1E6),// 西安的经纬度
        (int) (108.930000 * 1E6)); // 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * //
               // 1E6)
      ctrlMap.setCenter(point); // 设置地图中心点
      ctrlMap.setZoom(12); // 设置地图zoom级别
      //map.setTraffic(true);//设置地图为交通模式
      //map.setStreetView(true);
      //设置为卫星模式
      map.setSatellite(true);
      ctrlMap = map.getController();
      mylocTest = new MyLocationOverlay(MapGdActivity.this, map);
      mylocTest.enableMyLocation();
      mylocTest.enableCompass(); // 打开指南针
      map.getOverlays().add(mylocTest);
      LocationManagerProxy managerProxy = new LocationManagerProxy(this);
      managerProxy.requestLocationUpdates(LocationProviderProxy.AutonaviCellProvider,
        2000, 0, locationListener);

     }

     private void getLocationInfo(Location location) {
      String latLongInfo;
      TextView locationText = (TextView) findViewById(R.id.tv);
      if (location != null) {
       double lat = location.getLatitude();
       double lng = location.getLongitude();
       latLongInfo = "Lat: " + lat + "\nLong: " + lng;
      } else {
       latLongInfo = "No location found";
      }
      locationText.setText("Your Current Position is:\n" + latLongInfo);
     }

     private final LocationListener locationListener = new LocationListener() {
      public void onLocationChanged(Location location) {
       Log.e(MapGdActivity.class.getName(), "onLocationChanged");
       getLocationInfo(location);
       Toast.makeText(
         MapGdActivity.this,
         location.getAltitude() + "---" + location.getLatitude()
           + "---" + location.getLongitude(),
         Toast.LENGTH_LONG).show();
      }

      public void onProviderDisabled(String provider) {
       // TODO Auto-generated method stub
       Log.e(MapGdActivity.class.getName(), "onProviderDisabled=="
         + provider);
      }

      public void onProviderEnabled(String provider) {
       // TODO Auto-generated method stub
       Log.e(MapGdActivity.class.getName(), "onProviderEnabled=="
         + provider);
      }

      public void onStatusChanged(String provider, int status, Bundle extras) {
       // TODO Auto-generated method stub
       Log.e(MapGdActivity.class.getName(), "onStatusChanged==" + provider);
      }

     };
    }

    class LocactionM extends LocationManagerProxy {

     public LocactionM(Context arg0, String arg1) {
      super(arg0, arg1);
      // TODO Auto-generated constructor stub
     }

    }


        
    [3] ViewGroup格局
        来源: 互联网  发布时间: 2014-02-18
    ViewGroup布局

     

    viewgroup简单说就是可以装view的view.今天遇到一个问题,就是需要一个可以自动根据一行中view的宽度自动换行的布局,网上找了下,没有相关的例子,但是找到了思路:自定义一个viewgroup,然后在onlayout文件里面自动检测view的右边缘的横坐标值,和你的view的parent view的况度判断是否换行显示view就可以了。因为代码比较简单,就不多说了:

     

     1 public class MyViewGroup extends ViewGroup {
     2     private final static String TAG = "MyViewGroup";
     3     
     4     private final static int VIEW_MARGIN=2;
     5 
     6     public MyViewGroup(Context context) {
     7         super(context);
     8     }
     9     @Override
    10     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    11         Log.d(TAG, "widthMeasureSpec = "+widthMeasureSpec+" heightMeasureSpec"+heightMeasureSpec);
    12         
    13         for (int index = 0; index < getChildCount(); index++) {
    14             final View child = getChildAt(index);
    15             // measure
    16             child.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
    17         }
    18 
    19         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    20     }
    21 
    22     @Override
    23     protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
    24         Log.d(TAG, "changed = "+arg0+" left = "+arg1+" top = "+arg2+" right = "+arg3+" botom = "+arg4);
    25         final int count = getChildCount();
    26         int row=0;// which row lay you view relative to parent
    27         int lengthX=arg1;    // right position of child relative to parent
    28         int lengthY=arg2;    // bottom position of child relative to parent
    29         for(int i=0;i<count;i++){
    30             
    31             final View child = this.getChildAt(i);
    32             int width = child.getMeasuredWidth();
    33             int height = child.getMeasuredHeight();
    34             lengthX+=width+VIEW_MARGIN;
    35             lengthY=row*(height+VIEW_MARGIN)+VIEW_MARGIN+height+arg2;
    36             //if it can't drawing on a same line , skip to next line
    37             if(lengthX>arg3){
    38                 lengthX=width+VIEW_MARGIN+arg1;
    39                 row++;
    40                 lengthY=row*(height+VIEW_MARGIN)+VIEW_MARGIN+height+arg2;
    41                 
    42             }
    43             
    44             child.layout(lengthX-width, lengthY-height, lengthX, lengthY);
    45         }
    46 
    47     }
    48 
    49 }

      这里有个地方要注意,那就要明白ViewGroup的绘图流程:ViewGroup绘制包括两个步骤:1.measure 2.layout

      在两个步骤中分别调用回调函数:1.onMeasure()   2.onLayout()

      1.onMeasure() 在这个函数中,ViewGroup会接受childView的请求的大小,然后通过childView的 measure(newWidthMeasureSpec, heightMeasureSpec)函数存储到childView中,以便childView的getMeasuredWidth() andgetMeasuredHeight() 的值可以被后续工作得到。

      2.onLayout() 在这个函数中,ViewGroup会拿到childView的getMeasuredWidth() andgetMeasuredHeight(),用来布局所有的childView。

      3.View.MeasureSpec 与 LayoutParams 这两个类,是ViewGroup与childView协商大小用的。其中,View.MeasureSpec是ViewGroup用来部署 childView用的, LayoutParams是childView告诉ViewGroup 我需要多大的地方。

      4.在View 的onMeasure的最后要调用setMeasuredDimension()这个方法存储View的大小,这个方法决定了当前View的大小。

     

      效果图:

                                      


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