黑马程序员--iOS--Objective-C基础 (内存管理二)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

ARC的概念及原理

ARC ( automatic reference  counting ) 自动引用计数器。

指针的分类: 1)强指针   关键字  strong

                       2)  弱指针      关键字  weak

         __strong  Person   *p  =  [Person   new ]; 这就是一个强指针,  在创建对象时,默认为都是强指针。

ARC判断准则: 只要没有强指针指向对象,对象就会被释放。

<span style="font-size:12px;">int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //在ARC下对象释放的判断依据: 对象没有强指针指向
        //对象会立即释放内存空间
   
        Car *car1 = [Car new];
        //定义另外一个强指针指向
        //__strong 修饰符,修饰这个指针是一个强指针,也可以不写
        //__weak         修饰的这个指针是若指针
        __weak Car *car2 = car1;
        NSLog(@"car1 = %@,car2 = %@",car1,car2);
        //car1的指向发生改变,对于Car对象来说没有强指针指向了,所以要释放对象
        
        car1 = nil;  //
        //  1) car1 是强指针,重新指向其他内容了,对于对象来说没有强指针了
        //  2) 弱指针 赋值为nil
        
        NSLog(@"car1 = %@,car2 = %@",car1,car2);
        [car2 run];  //[nil run];
        
        [car1 run]; //[nil run];
        
        NSLog(@"xxxxxx");
        
    }
    return 0;
}</span>

ARC机制的原理: 编译器自动在代码合适的地方插入 retain  release  autorelease

ARC机制的特点: 1)判断是否是ARC

                                    查看项目信息   ;不能使用  retain  release  autorelease

                                    在重写dealloc方法中,不能使用[super   dealloc] ;

                              2)正常创建对象,不用手动释放对象

<span style="font-size:12px;">#import <Foundation/Foundation.h>
#import "Dog.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
    //ARC机制下对象的释放
        Dog *dog = [Dog new];
        [dog run];
    
    }
    return 0;
}</span>
 
<span style="font-size:12px;">#import "Dog.h"

@implementation Dog
-(void)run{

    NSLog(@"跑了");

}
- (void)dealloc
{
    NSLog(@"Dog dealloc");
//    [super dealloc];//可以重写dealloc方法,不能使用[super  dealloc]
}
@end
</span>
ARC下的@property 参数

strong   : 用于OC对象,相当于MRC中的 retain

<span style="font-size:12px;"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">weak    : 用于OC对象,相当于MRC中的 assign</span></span>

assign  : 基本数据类型

copy  :一般与用于  NSString 

@property (nonatomic,strong) Dog *dog

Category 的概念和作用

Category 是OC中特有的语法,一般称为分类\类目\

Category 的作用:

                    1)在不修改原有类的基础上增加新的方法

                    2)一个庞大的类可以分模块开发

                    3)一个庞大的类可以由多个人来开发,有利于团队开发。

分类的使用步骤

先声明,然后在实现

<span style="font-size:12px;">#import <Foundation/Foundation.h>

@interface Person : NSObject

@end
//声明类别
@interface Person (base)
-(void)run;
-(void)eat;
@end</span>

<span style="font-size:12px;">#import "Person.h"

@implementation Person

@end
//实现分类
@implementation Person   (base)
-(void)run{

    NSLog(@"人会跑");
}
-(void)eat{

    NSLog(@"人会吃");

}
@end</span>

也可以通过图形界面生成Category

分类的使用注意事项:

1)在分类的声明中不能声明实例变量

2)不能使用set\get方法 @property

3)分类可以访问原来类中的成员变量

4)如果分类和原来类出现同名的方法,优先调用分类中的方法,原来类中的方法会被忽略。

分类(Category)非正式协议

非正式协议就是给NSObject类创建的分类又叫做非正式协议,非正式协议一般不需要进行实现,一般在子类中进行方法重写。

应用:

<span style="font-size:12px;">#import "NSObject+countNum.h"

@implementation NSObject (countNum)

-(void)countNum{
    
    //先定义一个字符串
    
    NSString  *str = @"agsh67jh898hhjkhkhk2jhj68jl";
    
    int count;
    
    //循环控制
    for (int i = 0; i<str.length; i++) {
    
    //取出每一个字符
        
        unichar ch = [str characterAtIndex:i];
    
    
        if (ch >='0' && ch <='9') {
            
     
        //判断是否是阿拉伯数字
    
    
    
        //如果是则计数器+1
            
            count ++;
    
        }

        
    }
        //输出结果
    
    
    NSLog(@"%@中有%d个数字",str,count);

}

@end</span>

延展的概念

延展称为扩展(Extendsion)是Category 的一个特例。

其名字为空,并且添加的方法一定要实现

@interface  class  (){


int age;// 可以在延展中定义实例变量

}


-(void) test;    //这是一个相对私有的方法  //不能使用@impementation class () 中实现类别的方法。


@end 

这里需要在 .m中直接去实现。


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值