初始化,和赋值问题

 1 #import "AddressBook.h"
 2 #import "Person.h"
 3 /*
 4  1.为什么下面使用可变数组的时候可以不用初始化直接定义就可以
 5  2.为什么要用不可变数组接受返回值
 6  3.self的用法,在方法里为什么不能代替_addressBook,而用self.addressBook却可以
 7  4.什么时候用NSArray接收 ,什么时候又用不可变数组接收
 8  */
 9 
10 @implementation AddressBook
11 //重写初始化方法
12 -(instancetype)init
13 {
14     self = [super init];
15     if (self) {
16         _addressbook = [NSMutableDictionary dictionary];
17         }
18     return self;
19 }

1.我们重写init方法是因为如果用系统默认的init方法,在主函数里调用init的时候会调用父类的init,但是我们要为自己定义的实例变量进行一定的初始化操作,也就是说我们自己定义的类至少要有一个初始化方法,无论是自定义的还是重写系统初始化方法

 1     if (aPerson.name.length == 0 || aPerson.phone.length == 0) {
 2         NSLog(@"您所添加的联系人姓名和电话不能为空");
 3         return NO;
 4     }else{
 5         
 6         if([[_addressbook allKeys] containsObject:aPerson.groupName]){
 7         NSMutableArray *parr = [_addressbook objectForKey:aPerson.groupName];
 8         for (Person *p in parr) {
 9             if ([p.name isEqualToString:aPerson.name]) {
10                 NSLog(@"联系人重复");
11                 return NO;
12             }
13         }
14         [parr addObject:aPerson];
15             return YES;
16         }
17         NSMutableArray *grop = [NSMutableArray new];
18         [grop addObject:aPerson];
19         [_addressbook setObject:grop forKey:aPerson.groupName];
20         
21     }
22 
23     return NO;

2.上边的代码中,可变数组parr 和 grop 代表了两种不同的操作方式,数组名存放的是地址空间,parr存放的是字典中键值对的地址空间,所以不需要初始化,而grop 没有指向任何地址空间,所以需要初始化一下

     我们平时在赋值过程中一定要注意是复制了地址,还是重新开辟了空间复制了值,前者可以改变原来空间里的值,而后者则不能

原文地址:https://www.cnblogs.com/DevinSMR/p/5146913.html