一、属性的内部实现原理
assign:基本数据类型、delegate(但是所有类型都可以使用assign,只不过有些使用assign可能会出现问题)
retain:所有的对象类型,(基本数据类型不可以使用retain)
copy:
二、dealloc内释放实例变量
用来释放自己的实例变量
三、便利构造器方法的实现原理
return [p autorelease];
四、collection的内存管理
collection就是NSArray NSDictionary NSSet ... 等容器类
collection会自主管理自己内部的元素。
collection内存的自主管理:
加入collection中的对象会被retain
移除collection的对象会被release
collection被释放会对内部所有对象release
五、多态
多态 :父类指针指向子类对象(1、可以作为参数,2、可以作为返回值);
OC中有个多态运行时系统;
OC里的多态都是动态多态;
多态可以让多个类共享相同的方法名,简化了接口,减轻了程序员负担;
使用多态可以减少类型的判断,实现通用程序编程。
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
// assign:基本数据类型、delegate(但是所有类型都可以使用assign,只不过有些使用assign可能会出现问题)
@property(nonatomic,assign)NSInteger age;
// retain:所有的对象类型,(基本数据类型不可以使用retain)
@property(nonatomic,retain)NSString * name;
// copy:
@property (nonatomic,copy)NSString * sex;
// 初始化方法
-(instancetype)initWithName:(NSString *)name andAge:(NSInteger)age andSex:(NSString *)sex;
// 便利构造器
+(instancetype)personWithName:(NSString *)name andAge:(NSInteger)age andSex:(NSString *)sex;
@end
Person.m
#import "Person.h"
@implementation Person
@synthesize age = _age, name = _name, sex = _sex;
// 初始化方法 以后都这样写这个方法 以防内存的泄露
-(instancetype)initWithName:(NSString *)name andAge:(NSInteger)age andSex:(NSString *)sex{
if (self = [super init]) {
//切记:这里用setter方法
self.name = name;
self.age = age;
self.sex = sex;
}
return self;
}
// 便利构造器 (便利构造器中使用autorelease自动释放)
+(instancetype)personWithName:(NSString *)name andAge:(NSInteger)age andSex:(NSString *)sex{
Person * p = [[[Person alloc]initWithName:name andAge:age andSex:sex]autorelease];
return p;
}
//assign getter setter 内部实现
-(void)setAge:(NSInteger)age{
_age = age;
}
-(NSInteger)age{
return _age;
}
//retain:
//UI中会有一种设计模式,
-(void)setName:(NSString *)name{
if (_name != name) {
[name release];
_name = [name retain];
}
}
-(NSString *)name{
return [[_name retain]autorelease];
}
// copy的setter和getter方法
-(void)setSex:(NSString *)sex{
if (_sex != sex) {
[sex release];
_sex=[sex copy];
}
}
-(NSString *)sex{
return [[_sex copy]autorelease];
}
//dealloc作用,释放实例变量
-(void)dealloc{
[_name release];
[_sex release];
//调用父类的dealloc写在最后
[super dealloc];
}
@end
Teacher.h
#import "Person.h"
@interface Teacher : Person
@end
Teacher.m
#import "Teacher.h"
@implementation Teacher
@end
Student.h
#import "Person.h"
@interface Student : Person
@end
Student.m
#import "Student.h"
@implementation Student
@end
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
#import "Teacher.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// -----1.1--属性retain的内部实现原理-------
// 创建Person对象
Person * p1 = [[Person alloc]init];
NSString * s1 = [[NSString alloc]initWithFormat:@"贝爷"];
// 给p1的name赋值
p1.name = s1;
// 将s1释放,
[s1 release];
s1 = nil;
// 创建一个string对象s2
NSString * s2 = [[NSString alloc]initWithFormat:@"六娃"];
// s2给p1的name再赋值
p1.name = s2;
// 释放s2
[s2 release];
s2 = nil;
//
p1.name = p1.name;
//-----1.2--属性copy的内部实现原理-------
//创建person对象
Person *p2 = [[Person alloc]init];
//创建字符串s3
NSString * s3 = [[NSString alloc]initWithFormat:@"男"];
//
p2.sex = s3;
//释放s1
[s3 release];
s3 = nil;
//
NSString * s4 = [[NSString alloc]initWithFormat:@"女"];
//
p2.sex = s4;
//
[s4 release];
s4 = nil;
//-----2--便利构造器方法的实现原理----------------
NSString * name = [[NSString alloc]initWithFormat:@"贝爷"];
NSString * sex = [[NSString alloc]initWithFormat:@"男"];
//便利构造器创建的对象不需要释放,原因是便利构造器内部已经做过释放处理
Person * p5 = [[Person alloc]initWithName:name andAge:18 andSex:sex];
[name release];
name = nil;
[sex release];
sex = nil;
//-----3--多态----------------
Person * stu1 = [[Student alloc]init];
// NSObject * stu2 = [[Student alloc]init];
stu1 = [[Teacher alloc]init];
}
return 0;
}