Person.h
#import <Foundation/Foundation.h>
@class Animal;
@class Dog;
@class Cat;
@interface Person : NSObject
//声明属性
//属性的类型是NSString copy和retain都是浅拷贝
@property(nonatomic,retain)NSString *name;
@property(nonatomic,copy)NSString *sex;
//assign 用于基本数据类型 和代理对象的声明
@property(nonatomic,assign)NSInteger age;
//声明喂动物方法
//-(void)feedCat:(Cat *)cat;
//-(void)feedDog:(Dog *)dog;
-(void)feedAnimal:(Animal *)animal;
@end
Person.m
#import "Person.h"
#import "Cat.h"
#import "Dog.h"
#import "Animal.h"
@implementation Person
@synthesize name = _name;
@synthesize sex = _sex;
@synthesize age = _age;
-(void)dealloc {
[_name release];
[_sex release];
[super dealloc];
}
//重写setter方法 (在属性里面)
-(void)setName:(NSString *)name {
if (_name != name) {
[_name release];//让原先指向的内存的引用计数减1
// 让参数name指向的内存的引用计数加1;当内存被释放1次后,使引用计数不为0,实例变量才不会成为野指针
_name = [name retain];
}
}
-(NSString *) name {
// return _name;//在非原子性下可以直接return
// 在原子性下,保证实例变量不会 成为野指针;在子线程中会自动创建自动释放(即自动释放池),
return [[_name retain]autorelease];//原子性下,
}
-(void)setSex:(NSString *)sex {
if (_sex != sex) {
[_sex release];
_sex = [sex copy];
}
}
-(NSString *) sex {
return _sex;
}
-(void)setAge:(NSInteger)age {
// self.age = age;//在重写setter和getter中一定不能用点语法,即不能用属性调用;会产生循环调用
_age = age;
}
-(NSInteger)age{
return _age;
}
//声明喂动物方法
//-(void)feedCat:(Cat *)cat{
// [cat eat];
//}
//-(void)feedDog:(Dog *)dog{
// [dog eat];
//}
-(void)feedAnimal:(Animal *)animal{
// animal在声明的时候是一个animal指针,运行时会指向其他类型
// 父类指针指向子类对象,调相同的方法出现不同结果
[animal eat];
}
@end
Animal.h
#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void)eat;
@end
Animal.m
#import "Animal.h"
@implementation Animal
-(void)eat{
NSLog(@"滚过来");
}
@end
Dog.h
#import "Animal.h"
@interface Dog : Animal
//-(void)eat;
@end
Dog.m
#import "Dog.h"
@implementation Dog
-(void)eat{
[super eat];
NSLog(@"狗吃��");
}
@end
这里写代码片
#import "Animal.h"
@interface Cat : Animal
//-(void)eat;
@end
Cat.h
“`
import “Animal.h”
@interface Cat : Animal
//-(void)eat;
@end
Cat.m
import “Cat.h”
@implementation Cat
-(void)eat{
[super eat];
NSLog(@”猫吃��”);
}
@end