OC 简单通讯录操作(控制台)
第一次发博客,望大家多多批评~~
首先,今天我们做的是一个基于OC语言的一个控制台上的通讯录操作。创建好工程后,我们先建立一个AddressContact类(一个联系人类)。这里我用的是先实例变量,然后用@property 属性,然后建立了一个初始化方法。当然你会发现这里我所有的实例变量都是NSString,这是一个取巧的地方,后面会讲到。具体代码如下:
1 #import <Foundation/Foundation.h> 2 3 @interface AddressContact : NSObject 4 5 { 6 NSString *_name; 7 NSString *_gender; 8 NSString *_phoneName; 9 NSString *_address; 10 NSString *_groupName; 11 NSString *_age; 12 } 13 @property(nonatomic,retain)NSString * name; 14 @property(nonatomic,retain)NSString * gender; 15 @property(nonatomic,retain)NSString * phoneName; 16 @property(nonatomic,retain)NSString * address; 17 @property(nonatomic,retain)NSString * groupName; 18 @property(nonatomic,retain)NSString * age; 19 20 -(id)initWithName:(NSString *)name 21 withPhoneName:(NSString *)phoneName 22 withGender:(NSString *)gender 23 withAddress:(NSString *)address 24 withAge:(NSString *)age; 25 @end
现在我们在 .m中实现 .h中的方法,这里我省略了属性的实现(@synthesize),组名直接等于了姓名的首字母(大写):
1 #import "AddressContact.h" 2 3 @implementation AddressContact 4 -(id)initWithName:(NSString *)name 5 withPhoneName:(NSString *)phoneName 6 withGender:(NSString *)gender 7 withAddress:(NSString *)address 8 withAge:(NSString *)age{ 9 self=[super init]; 10 if (self) 11 { 12 _name=name; 13 _gender=gender; 14 _phoneName=phoneName; 15 _address=address; 16 _age=age; 17 _groupName=[[name substringToIndex:1] uppercaseString]; 18 19 } 20 return self; 21 } 22 - (NSString *)description 23 { 24 return [NSString stringWithFormat:@"%@,%@,%@,%@,%@,%@", _name,_age,_gender,_phoneName,_address,_groupName]; 25 } 26 27 @end
之后,我把对于通讯录的操作,放在了另一个AddAperson类中,首先两个实例变量,一个NSMutableArray,一个NSMutableDictionary用于方法的实现。
1 #import <Foundation/Foundation.h> 2 @class AddressContact; 3 @interface AddAperson : NSObject 4 { 5 NSMutableArray *_arr; 6 NSMutableDictionary *_addressBook; 7 } 8 @property (nonatomic,retain)NSMutableArray *arr; 9 @property (nonatomic,retain)NSMutableDictionary *addressBook; 10 -(id)initWithArr:(NSMutableArray *)arr 11 withAddressBook:(NSMutableDictionary *)addressBook; 12 -(void)verifyAndAppend:(AddressContact *)person; 13 -(void)printAllPerson; 14 -(void)searchWithGender:(NSString *)gender; 15 -(void)searchWithPhoneName:(NSString *)addressContactPhoneName; 16 -(void)sortWithGroupName:(NSString *)groupName; 17 -(void)deleteWithGroupName:(NSString *)groupName; 18 -(void)deleteWithName:(NSString *)name; 19 @end
1 #import "AddAperson.h" 2 #import "AddressContact.h" 3 @implementation AddAperson 4 -(id)initWithArr:(NSMutableArray *)arr 5 withAddressBook:(NSMutableDictionary *)addressBook 6 { 7 self=[super init]; 8 if (self) 9 { 10 _arr=arr; 11 _addressBook=addressBook; 12 } 13 return self; 14 } 15 -(void)verifyAndAppend:(AddressContact *)person 16 { 17 [_arr addObject:person]; 18 if ([[person name] isEqualToString:@""]|| [[person phoneName] isEqualTo:@""]) 19 { 20 NSLog(@"添加失败"); 21 //添加失败后,移除这个对象 22 [_arr removeObject:person]; 23 return; 24 }else 25 { 26 //将数据加入到字典中 27 NSString *key=[[[person name] uppercaseString] substringToIndex:1]; 28 NSMutableArray *arr=[NSMutableArray arrayWithArray:_addressBook[key]]; 29 [arr addObject:person]; 30 [_addressBook setObject:arr forKey:key]; 31 } 32 } 33 -(void)printAllPerson 34 { 35 for (int i=0; i<[_arr count]; i++) 36 { 37 NSLog(@"%@",_arr[i]); 38 } 39 } 40 //性别查找 41 -(void)searchWithGender:(NSString *)gender 42 { 43 for (int i=0; i<[_arr count]; i++) { 44 if ([[_arr[i] gender] isEqualToString:gender]) 45 { 46 NSLog(@"%@",_arr[i]);; 47 }else{ 48 NSLog(@"无此联系人!!!!"); 49 } 50 } 51 } 52 //电话号码查找 53 -(void)searchWithPhoneName:(NSString *)addressContactPhoneName 54 { 55 for (int i=0; i<[_arr count]; i++) 56 { 57 if ([[_arr[i] phoneName] isEqualTo:addressContactPhoneName] ) 58 { 59 NSLog(@"%@",_arr[i]); 60 }else{ 61 NSLog(@"无此联系人!!!!"); 62 } 63 } 64 } 65 //组名排序 66 -(void)sortWithGroupName:(NSString *)groupName{ 67 //创建一个临时数组放入字典中所有的key值 68 NSArray *arr=[NSArray arrayWithArray:[_addressBook objectForKey:groupName]]; 69 //遍历数组 70 for (int i=0; i<[arr count]; i++) 71 { //创建一个临时数组,存放数组中的数据排序后的结果 72 NSArray *arr1=[arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) 73 { 74 return [[obj2 name] compare:[obj1 name]]; 75 }]; 76 NSLog(@"%@",arr1[i]); 77 } 78 } 79 //按组名查找并删除 80 -(void)deleteWithGroupName:(NSString *)groupName{ 81 NSArray *arr=[_addressBook allKeys]; 82 for (NSString *key in arr) { 83 if ([key isEqualTo:groupName]) { 84 [_addressBook removeObjectForKey:key]; 85 }else{ 86 NSLog(@"没有找到组名!!!"); 87 } 88 } 89 } 90 //按姓名查找并删除 91 -(void)deleteWithName:(NSString *)name{ 92 NSArray *arr=[_addressBook allKeys]; 93 for (int i=0; i<[arr count]; i++) 94 { 95 for (AddressContact * add in _addressBook[arr[i]]) { 96 [_addressBook[arr[i]] removeObject:add]; 97 } 98 } 99 } 100 @end
main里的调用
1 #import <Foundation/Foundation.h> 2 #import "AddressContact.h" 3 #import "AddAperson.h" 4 int main(int argc, const char * argv[]) { 5 @autoreleasepool { 6 // AddAperson *asdf =[[AddAperson alloc]init]; 7 //创建一个可变字典 8 NSMutableDictionary *addressBook=[[NSMutableDictionary alloc] init]; 9 10 //创建一个可变数组 11 NSMutableArray *add=[NSMutableArray array]; 12 [add retain]; 13 NSLog(@"%lu",add.retainCount); 14 //实例化一个通讯录对象 15 AddAperson *addPerson=[[AddAperson alloc] initWithArr:add withAddressBook:addressBook]; 16 //循环 17 int count=0; 18 while (1>0) { 19 NSLog(@"***************通讯录控制台***************"); 20 NSLog(@"***添加联系人:1 ***"); 21 NSLog(@"***按性别搜索:2 ***"); 22 NSLog(@"***按号码搜索:3 ***"); 23 NSLog(@"***按姓名排序:4 ***"); 24 NSLog(@"***所有联系人:5 ***"); 25 NSLog(@"***按组名查找并删除:6 ***"); 26 NSLog(@"***按姓名查找并删除:7 ***"); 27 NSLog(@"****************************************"); 28 NSLog(@"请输入n:"); 29 //根据控制台提示输入count的值 30 scanf("%d",&count); 31 getchar(); 32 switch (count) 33 { 34 case 1: 35 { 36 NSLog(@"请输入联系人信息(每项间逗号隔开,空信息用单空格,格式为姓名,手机号,性别,住址,年龄):"); 37 //新建一个字符串,去接收输入的数据 38 char str[100]={0}; 39 scanf("%s",str); 40 getchar(); 41 //将字符串转换成字符串对象 42 NSString *str1=[[NSString alloc] initWithFormat:@"%s",str]; 43 //根据“,”将字符串对象分成需要的几个字符串对象存进数组 44 NSArray *array=[str1 componentsSeparatedByString:@","]; 45 //实例化一个person对象 46 AddressContact *person=[[AddressContact alloc] initWithName:array[0] withPhoneName:array[1] withGender:array[2] withAddress:array[3] withAge:array[4]]; 47 //调用判定、添加联系人的方法 48 [addPerson verifyAndAppend:person]; 49 break; 50 } 51 case 2: 52 { 53 NSLog(@"请输入性别:"); 54 //新建一个字符串,去接收输入的数据 55 char str[20]={0}; 56 scanf("%s",str); 57 getchar(); 58 //将字符串转换成字符串对象 59 NSString *str1=[[NSString alloc] initWithFormat:@"%s",str]; 60 [addPerson searchWithGender:str1]; 61 break; 62 } 63 case 3: 64 { 65 NSLog(@"请输入查询的手机号:"); 66 //新建一个字符串,去接收输入的数据 67 char str[20]={0}; 68 scanf("%s",str); 69 getchar(); 70 //将字符串转换成字符串对象 71 NSString *str1=[[NSString alloc] initWithFormat:@"%s",str]; 72 //调用据号码查找 73 [addPerson searchWithPhoneName:str1]; 74 break; 75 } 76 case 4: 77 { NSLog(@"请输入组名:"); 78 //新建一个字符串,去接收输入的数据 79 char str[20]={0}; 80 scanf("%s",str); 81 getchar(); 82 //将字符串转换成字符串对象 83 NSString *str1=[[NSString alloc] initWithFormat:@"%s",str]; 84 NSLog(@"%@分组中按姓名排序中......",str1); 85 //调用排序方法 86 [addPerson sortWithGroupName:str1]; 87 break; 88 } 89 case 5:{ 90 [addPerson printAllPerson]; 91 } 92 //按组名查找并删除 93 case 6:{ 94 char str[20]={0}; 95 NSLog(@"请输入组名:"); 96 scanf("%s",str); 97 getchar(); 98 //将字符串转换成字符串对象 99 NSString *str1=[[NSString alloc] initWithFormat:@"%s",str]; 100 [addPerson deleteWithGroupName:str1]; 101 102 break; 103 } 104 //按姓名查找并删除 105 case 7:{ 106 char str[20]={0}; 107 NSLog(@"请输入姓名:"); 108 scanf("%s",str); 109 getchar(); 110 //将字符串转换成字符串对象 111 NSString *str1=[[NSString alloc] initWithFormat:@"%s",str]; 112 [addPerson deleteWithName:str1]; 113 break; 114 } 115 116 default:{ 117 NSLog(@"输入错误!!!"); 118 break; 119 } 120 break; 121 } 122 } 123 } 124 return 0; 125 }
这里的代码中,控制台输入的是字符串,先接收,然后把它改为对象类型,再拆分。通过这个模式将我们输入的字符串使用起来。这也就是我为什么要把联系人类的实例变量都设置成NSString的原因。
最后,希望各路大神,看看这个代码怎么检查内存泄露,我用commond + shift + b试了好多次了,而且水管我不太会用。。。