建立父类Person类
person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic,copy)NSString *name;
@property (nonatomic,retain)NSNumber *age;
-(instancetype)initWithName:(NSString *)name
age:(NSNumber *)age;
+(Person *)personWithName:(NSString *)name age:(NSNumber *)age;
@end
person.m
#import "Person.h"
@implementation Person
@synthesize name=_name;
-(instancetype)initWithName:(NSString *)name
age:(NSNumber *)age{
self=[super init];
if (self) {
//使用点语法调用它的setter方法,
//使之retain或者copy一下.
self.name=name;
self.age=age;
}
return self;
}
+(Person *)personWithName:(NSString *)name age:(NSNumber *)age{
Person *p=[[Person alloc] initWithName:name age:age];
//使用了autorelease释放对象.
return [p autorelease];
}
//getter,setter,用实例变量 _name
//dealloc 用实例变量 _name
//初始化
-(void)setName:(NSString *)name{
if (_name!=name) {
[_name release];
_name=[name copy];
}
}
-(NSString *)name{
return [[_name retain] autorelease];
}
-(void)dealloc{
[_name release];
[_age release];
[super dealloc];
}
@end
子类Student继承Person
Student.h
#import "Person.h"
@interface Student : Person
@property (nonatomic,copy)NSString *stuNum;
-(void)sayHi;
-(instancetype)initWithName:(NSString *)name
age:(NSNumber *)age
stuNum:(NSString *)stuNum;
+(Student *)stuWithName:(NSString *)name
age:(NSNumber *)age
stuNum:(NSString *)stuNum;
@end
Student.m
#import "Student.h"
@implementation Student
@synthesize stuNum=_stuNum;
-(void)dealloc{
[_stuNum release];
[super dealloc];
}
-(void)sayHi{
NSLog(@"hi");
// [_stuNum release];
// [super dealloc];
}
-(instancetype)initWithName:(NSString *)name
age:(NSNumber *)age
stuNum:(NSString *)stuNum;{
self=[super init];
if (self) {
self.stuNum=stuNum;
}
return self;
}
+(Student *)stuWithName:(NSString *)name
age:(NSNumber *)age
stuNum:(NSString *)stuNum{
Student *s=[[Student alloc]initWithName:name age:age stuNum:stuNum];
return [s autorelease];
}
@end
main.m里边
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
/*
Person *p=[[Person alloc] init];
[p retain];
NSLog(@"%ld",[p retainCount]);
NSArray *array=[[NSArray alloc] initWithObjects:p, nil];
NSLog(@"%ld",[p retainCount]);
[array release];
NSLog(@"%ld",[p retainCount]);
//当我们将一对象放入容器中的时候,该对象的计数+1.
//当我们吧容器释放掉之后,容器中的对象引用计数全部-1
[p release];
[p release];
*/
//父类指针指向子类对象
//多态
Person *stu=[Student stuWithName:@"wangxiaoer" age:@18 stuNum:@"110"];
stu.name=@"wangxiaoesa";
stu.age=@10;
// [stu sayHi];
Student *s= (Student *)stu;
s.stuNum=@"1230";
}
return 0;
}