最近在用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中的调试功能,真尼玛太垃圾了!!!













