美文网首页
多态、ARC

多态、ARC

作者: 我不白先生 | 来源:发表于2020-09-20 09:38 被阅读0次

1.1是继承的一个应用。应用继承的重写概念
1.2一个对外接口,多个内在实现
1.3在OC程序中,体现为
1.3.1父类的指针可以指向子类的对象
1.3.2该指针能调用子类对象中重写的父类方法
1.3.3该指针不能调用子类中派生的方法
1.4使用形式
1.4.1方法形参
1.4.2方法返回值
1.5作用:对修改关闭,对扩展开放

#import "ViewController.h"
#import "TRDog.h"
#import "TRCat.h"
typedef enum
{
    DOG,CAT,
}Animal;
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *outputLabel;
-(void)method1;//多态的概念
-(void)method2;
-(void)method3;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self method3];
}
-(void)method1//多态的概念
{
    TRAnimal *a = [[TRDog alloc] initWithName:@"小黑子" andAge:3];//父类的指针可以指向子类的对象
    self.outputLabel.text = [a eat];//父类指针将调用子类重写的方法
    self.outputLabel.text = [a sleep];
    //self.outputLabel.text = [a watchHome];//父类指针只能调用子类对象中继承过来的父类方法,不能调用子类派生的方法
    a = [[TRCat alloc] initWithName:@"老咪" andAge:1];
    self.outputLabel.text = [a eat];//体现了多态,一个对外接口,多个内在实现
}
//参数多态
-(void)show:(TRAnimal *)a
{
    self.outputLabel.text = [a eat];
}
-(void)method2
{
    TRDog *dog = [[TRDog alloc] initWithName:@"小黑子" andAge:3];
    [self show:dog];
    [self show:[[TRCat alloc] initWithName:@"老咪" andAge:1]];
    
}
//返回值多态
-(TRAnimal*)get:(Animal)a
{
    switch (a) {
        case DOG:
            return [[TRDog alloc]initWithName:@"小黑子" andAge:3];
        case CAT:
            return [[TRCat alloc]initWithName:@"老咪" andAge:1];
    }
}
-(void)method3
{
   self.outputLabel.text = [[self get:DOG] eat];
   self.outputLabel.text = [[self get:CAT] eat];
}
@end

2.ARC
2.1ios5.0开始使用,ios7.0强制使用
2.2不允许程序员调用retain、release、retainCount方法,而是由编译器自动添加完成的其调用语句。
2.3新增的关键字

-(void)method1
{
    TRPoint *p = [[TRPoint alloc] initWith:10 andY:20];
    //self.outputLabel.text = [NSString stringWithFormat:@"%lu",[p retainCount]];
    //...
    //[p release];
}//在释放指针变量p之前,ARC首先调用[p release];再释放指针p
-(void)method2
{
    TRPoint *p1 = [[TRPoint alloc] initWith:10 andY:20];
    TRPoint *p2;
    p2 = p1;//编译器将p1的地址赋值给p2之后,自动添加[p2 retain];
    //[p2 retain];
}//ARC自动添加[p1 release];、[p2 release];
-(void)method3
{
    TRPoint *p1 = nil;
    {
        TRPoint *p2 = [[TRPoint alloc]initWith:10 andY:20];
        p1 = p2;//ARC自动添加[p1 retain];
    }//ARC自动添加【p2 release];
}//ARC自动添加[p1 releas];

2.3.1__strong强引用(默认)的
2.3.2__weak弱引用

-(void)method4
{
    TRPoint *p1 = [[TRPoint alloc]initWith:10 andY:20];
    {
        __strong TRPoint *p2 = [[TRPoint alloc]initWith:30 andY:40];
        p1 = p2;//在此句之前ARC自动添加[p1 releas],在此句之后ARC自动添加[p1 retain];
    }//ARC自动添加【p2 release];
}//ARC自动添加[p1 releas];
-(void)method5
{    NSString *str = @"";
    __weak TRPoint *p1 = nil;
    {
        
        TRPoint *p2 = [[TRPoint alloc]initWith:10 andY:20];
        p1 = p2;//ARC不会自动添加[p1 retain];
        str = [str stringByAppendingFormat:@"%p\n",p1];
    }//ARC自动添加【p2 release];、p1=nil;
    str = [str stringByAppendingFormat:@"%p\n",p1];
    self.outputLabel.text = str;
}

2.3.3 __unsafe_unretained也是弱指针
2.3.4 __autoreleasing放入自动释放池
2.4property参数
2.4.1strong,默认的
2.4.2weak

相关文章

网友评论

      本文标题:多态、ARC

      本文链接:https://www.haomeiwen.com/subject/kabdyktx.html