内容回顾
Person *p = [[Person alloc] init];
NSString *name = [[NSString alloc] initWithFormat:@"王龙"];
NSString *name1 = [[NSString alloc] initWithFormat:@"zhuanghzhua"];
p.name = name;
NSLog(@"%ld",name.retainCount);
p.name = name1;
[name release];
[name1 release];
// 这个位置 p释放了吗
NSLog(@"%@",p.name);
[p release];
// 定义了属性 同时在实现set和get方法的时候,属性生成的变量不带下划线
// 写一个不报错,是因为系统默认生成了一个方法 和下划线name
- (void)setName:(NSString *)name{
if (_name != name) {
// 如果你对空进行release 相当于无操作
[_name release];
_name = [name retain];
}
}
- (NSString *)name{
return _name;
}
- (instancetype)initWithAge:(NSInteger)age name:(NSString *)name sex:(NSString *)sex{
self = [super init];
if (self) {
// 学了属性和内存之后 不要出现_name 全部写self;
self.name = name;
// 这种赋值方式 对于基本数据类型是安全的
// 对于对象类型赋值是不安全的 应该调用set方法 保证内存的安全
self.sex = sex;
self.age = age;
}
return self;
}
容器内存的管理
数组
数组在添加元素时,如果你把一个元素添加到容器类的对象中(数组 字典 集合中) 那么系统将自动给数组中的元素 发送retain消息 从而使数组中的元素 引用计数 + 1
数组在释放的时候,如果数组释放的时候,那么在释放之前,系统会自动给数组中的每一个元素发送一个release消息,从而使数组中的元素 引用计数- 1
字典
与数组一样
多态
多态的实质:就是父类指针指向 子类对象
具体用到的地方:UI界面的添加控件addSubView:(UIView *)
还有一个就是写通用的方法 根绝不同类型的参数 调用不同类下的方法