最近在用Xcode调试iOS程序,发现里面的调试功能,不是一般的垃圾。下面好好抱怨一下。
1.极其不方便查看变量值
此处贴上相关的源代码:
BirdSighting.h:
// // BirdSighting.h #import <Foundation/Foundation.h> @interface BirdSighting : NSObject <NSCoding> { } @property (nonatomic, copy) NSString *name; @property (nonatomic, copy) NSString *location; @property (nonatomic, strong) NSDate *date; @property (nonatomic) UIImage *image;
BirdSightingDataController.h:
// // BirdSightingDataController.h #import <Foundation/Foundation.h> @class BirdSighting; @interface BirdSightingDataController : NSObject { } @property (nonatomic, copy)NSMutableArray *masterBirdSightingList; - (void)saveBirdSightingList; @end
BirdSightingDataController.m:
// // BirdSightingDataController.m // BirdWatching // // Created by li crifan on 12-8-21. // Copyright (c) 2012年 li crifan. All rights reserved. // #import "BirdSightingDataController.h" #import "BirdSighting.h" @interface BirdSightingDataController() -(void)initializeDefaultDataList; @end @implementation BirdSightingDataController -(void)initializeDefaultDataList{ //restore data NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *savedEncodedData = [defaults objectForKey:@"BirdSightingList"]; if(savedEncodedData == nil) { NSMutableArray *sightingList = [[NSMutableArray alloc] init]; self.masterBirdSightingList = sightingList; } else{ self.masterBirdSightingList = (NSMutableArray *)[NSKeyedUnarchiver unarchiveObjectWithData:savedEncodedData]; } } -(void)setMasterBirdSightingList:(NSMutableArray *)newList{ if(_masterBirdSightingList != newList) { _masterBirdSightingList = [newList mutableCopy]; } } -(void)addBirdSightingWithName:(NSString *)inputBirdName location:(NSString *)inputLocation date:(NSDate *)date image:(UIImage *)image{ BirdSighting *sighting; //NSDate *today = [NSDate date]; //sighting = [[BirdSighting alloc]initWithName:inputBirdName location:inputLocation date:today]; sighting = [[BirdSighting alloc]initWithName:inputBirdName location:inputLocation date:date image:image]; [self.masterBirdSightingList addObject:sighting]; [self saveBirdSightingList]; } - (void)saveBirdSightingList{ // NSData *encodedSingleObj = [NSKeyedArchiver archivedDataWithRootObject:sighting]; // NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // [defaults setObject:encodedSingleObj forKey:@"SingleBirdSightingObject"]; //save data NSData *encodedCurBirdSightingList = [NSKeyedArchiver archivedDataWithRootObject:self.masterBirdSightingList]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:encodedCurBirdSightingList forKey:@"BirdSightingList"]; [defaults synchronize]; } @end
对于上述代码,想要调试查看self.dataController.masterBirdSightingList的值:
很明显,目前已经的调试功能,虽然是可以看到self下的dataController下的masterBirdSightingList,但是也只是显示出其是个数组__NSArrayM,
对应的地址是0x6dd2d20,里面包含3个对象。
其他更多的信息,本以为点击那个向右的箭头:
可以显示出其下相关的变量的呢,结果却是空白的:
而对于masterBirdSightingList中的每个BirdSighting变量的值,都无法查看到了。
然后也继续去折腾了试试其他办法是否可以查看到对应的数据。
双击对应的masterBirdSightingList,可以显示出对应的编辑窗口:
后来找了半天,唯一尼玛有点用的,是这个右击变量后选择“Print Description of xxx”:
所打印出来的信息:
Printing description of self->_dataController->_masterBirdSightingList:
<__NSArrayM 0x6dd2d20>(<BirdSighting: 0x6dd2f40>,
<BirdSighting: 0x6dd3bb0>,
<BirdSighting: 0x6dd4a50>
)
终于算是看到了masterBirdSightingList下的BirdSighting的影子了。
然后就接着想办法去查看每个BirdSighting的值。
2.内存查看窗口,效果也很不好
然后对于上述已经知道了每个BirdSighting的地址了,想要去打开对应的内存监视窗口,貌似也没找到。
后来还是右击masterBirdSightingList,然后选择View Memory for _masterBirdSightingList:
而打开的内存调试窗口:
不过后来还是找到了打开内存窗口的位置:
Product -> Debug -> View Memory
但是对于内存的值查看,还是不是很好用。
而对于此处想要查看之前所说的三个BirdSighting,结果只能靠自己手动输入对应的值查看了:
对应的每页查看大小,是可以设置的:
如此,一点点输入地址,结果对于变量的值的查看,也还是,除了个别字符串的值,比如我此处的BirdName的string,其他的基本看不懂。
所以,总是,查看变量值,内存监视等,都很不好用。
3.无法添加监视某个值
无法直接点击某个值,然后加入调试窗口,然后实现始终可以监视该变量的值。
最接近的是,点击某个已经在Debug窗口中出现的变量,然后选择Watch xxx:
但是没太搞懂,因为本身当前变量已经在debug窗口了,还添加个啥啊?
5.如何调试/查看数组变量
参考:
去设置该变量为private:
@interface BirdSightingDataController : NSObject { @private NSMutableArray *masterBirdSightingList; } @property (nonatomic, copy)NSMutableArray *masterBirdSightingList;
然后试试调试效果。
结果却看到的新添加的private的变量是空的值:
所以,意思是,如果变量为private的interface变量,那也是可以实时显示其变量值的。
但是对于property变量,却无法查看详细的值。
此处知道这个暂时就行了,等以后有需要的话,再把变量改为private的interface变量。
但是很奇怪的,为何property变量,就无法直接查看其值呢?
难道Mac的Xcode的开发人员,连这点功能都没能力实现?
不清楚,求高手解释。
6.关于Xcode vs VS(Visual Studio)
关于VS和Xcode的对比,找到这个:
Xcode 4.3 vs Visual Studio 11 beta
没有去细看,但是很同意其总结:
比起Windows的Visual Studio的功能,Xcode还是差很多的。
【总结】
总之,目前的感觉,Xcode的调试功能,不要太挫,太弱啊。
当然,上述只是我个人感觉。
如有高手知道有其他更好用的调试方法,还请告知。
转载请注明:在路上 » 【整理】Xcode中的调试功能,真尼玛太垃圾了!!!