持续创作,加速成长!这是我参加「日新计划 6 月更文挑战」的第36天,点击查看活动详情

导言

在oc 中,假如目标没有被强引证,会被立即开释。

__weak 表示弱引证 : Assigning retained object to weak variable; object will be released after assignment

I weak &strong

1.1 运用场景:

控件的运用 :

  1. 假如界面的建立,是选用storyBoard进行连接,控件特点用weak。
  2. 假如是选用纯代码建立界面,控件能够运用strong进行润饰;由于此刻控件的目标的两个强引证(ViewController的noLable,以及view的subview)都会跟着操控器ViewController的销毁而被开释。
[self.view addSubview:_noLabel];
//将弱引证参照的_noLabel增加到视图UIView;UIViewController.h-》@property(null_resettable, nonatomic,strong) UIView *view;-》UIView.h :@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;-》强引证UILabel目标,所以这个UILabel目标已经有具有者,不会被放--再增加进程都是操作UILabel目标的地址

iOS小技能(开发规范): weak和strong修饰符的规范使用

开释目标的进程

  1. 程序先对操控器进行开释,假如没有目标对View进行强引证,程序将对view进行开释。
  2. 内存中假如没有存在对subviews 目标进行强引证,就释subviews。 此刻假如UILabel目标没有被强引证,UILabel目标将被开释 。

1.2 特点的润饰

  1. 创建的自界说目标,都用strong。

由于这些目标不会有UIViewController的操控,来进行强引证。

  1. NSString 运用copy;NSString应该运用copy而不是strong的特点特性。

即便你声明一个NSString的特点,有人或许传入一个NSMutableString的实例,然后在你没有注意的情况下修正它。

  1. 数字型的,比如int ,便是运用assign。

1.3 weak和strong的不同

当一个目标不再有strong类型的指针指向它的时分 它会被开释 ,即便还有weak型指针指向它。一旦最后一个strong型指针离去 ,这个目标将被开释,一切剩下的weak型指针都将被铲除。

例子: 

  1. 幻想咱们的目标是一条狗,狗想要跑掉(被开释)。  strong型指针就像是栓住的狗。只需你用牵绳挂住狗,狗就不会跑掉。假如有5个人牵着一条狗(5个strong型指针指向1个目标),除非5个牵绳都脱落 ,否着狗是不会跑掉的。  

  2. weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只需狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只需狗的牵绳脱落,狗就会跑掉,不论有多少小孩在看着它。

II tom 基本完成(序列帧动画)

  1. UIImageView 帧动画的运用
  2. UIImage的两种加载办法 :

有缓存办法的加载办法

无缓存办法将图片加载至内存

  1. 重复代码的封装抽取:等优化完毕之后,在删除被优化的旧代码;

常见的优化点有: 数据独立性的处理(plist、网络)、魔法数字的问题解决(宏,枚举enum)、特点的懒加载(重写getter办法)

代码示例

/**
  序列帧动画:顺序播映一组图片
 1.提示、假如放置于Assets.xcassets目录中的图片不能运用imageWithContentsOfFile:path进行加载,只能运用imageName进行加载,即内存由系统担任了;Assets.xcassets 寄存一些常常运用的小图片素材
 2。Supporting Files 目录一般寄存,大、不常常运用的图片;
 */
- (void) frameAnimation : (UIButton *) button{
    //假如正在动画播映直接退出,来确保确保一个动画播映完成
    if ([self.imageList isAnimating]) {//考虑用户的重复点击进行频频的展示帧动画问题
        return;
    }
    //顺序的改变UIImageView 的image,此刻需求的参数有:需求播映的序列帧图片数组animationImages(UIImage目标)、帧动画的持续时间animationDuration、帧动画的履行次数animationRepeatCount--可自行查看UIImageView的特点和办法
    //动画图片的数组--可修正的数组NSMutableArray(manage a modifiable array of objects)
    NSMutableArray *arrayImage = [NSMutableArray array];//Creates and returns an empty array.
    //增加帧动画播映的图片
    //设置图片的数组的
    for (int i = 0; i< self.animationImages[button.tag].count ; i++) {
        //获取图片称号
        NSString *pictureNamePrefix = self.animationImages[button.tag][i];//获取文件名+扩展名       
        //办法一:有缓存加载图片
        // 增加Image的目标到帧图片数组
//       [arrayImage addObject: [UIImage imageNamed:pictureNamePrefix]];//参数为图片称号,png 格局的能够不加扩展名
        //办法二:无缓存办法加载图片-指定扩展名
//        NSArray *arrayPicture = [pictureNamePrefix componentsSeparatedByString:@"."];//从字符平分隔成2个元素的数组(图片名+扩展名)
//        NSString *path = [[NSBundle mainBundle] pathForResource:arrayPicture[0] ofType: arrayPicture[1]];//获取图片的全路径
        //办法二:无缓存办法加载图片-不指定扩展名
        NSString *path = [[NSBundle mainBundle] pathForResource:pictureNamePrefix ofType:nil];
        [arrayImage addObject:[ UIImage imageWithContentsOfFile:path]];
    }
    [self.imageList setAnimationImages:arrayImage];
    //设置帧动画的持续时间
    [self.imageList setAnimationDuration: self.imageList.animationImages.count * 0.1];
    //设置帧动画的履行次数
    [self.imageList setAnimationRepeatCount:1];
     //开端动画
    [self.imageList startAnimating];
    //开释资源:动画完毕之后铲除帧动画数组
    //nvokes a method of the receiver on the current thread using the default mode after a delay.
//    [self performSelector:@selector(cleanUpAnimationsArray) withObject:nil afterDelay:self.imageList.animationDuration];//界说在NSObject的分类中@interface NSObject (NSDelayedPerforming)
    //铲除内存的代码简化--能够避免界说cleanUpAnimationsArray办法
    [self.imageList performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.imageList.animationDuration];
}

see also

iOS解决紧缩之后图片含糊的问题

blog.csdn.net/z929118967/…

联系作者: iOS逆向(公号:iosrev)


作者简介:CSDN 博客专家认证丨全站 Top 50、华为云云享专家认证、iOS逆向公号号主


简历模板、技术合作。关注我,都给你。