欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

day02-Strong&weak; 图片浏览器、tom 猫

程序员文章站 2022-06-02 14:17:50
...

前言

一、 用纯代码开发的过程:
1. 确定界面元素,要有什么内容
2.用代码搭建界面
3.编写代码
二、@property

1.创建了getter & setter方法
2. 生产一个变量名为带_ 的成员变量;直接读取成员变量不会经过getter&setter方法
三、 解决代码执行顺序的存在依赖的方法‘

采用懒加载,即通过重写getter方法实现,达到的效果是,在对象最需要的时候创建–重写getter方法
1.资源属性的懒加载
2.#pragma mark - 控件的懒加载

四、weak &strong

  1. 在oc 中,如果对象没有被强引用,会被立即释放
    1. 默认的对象都是强引用
      __weak 表示弱引用 Assigning retained object to weak variable; object will be released after assignment

3.使用场景:
/**
控件的使用
1).如果界面的搭建,是采用storyBoard进行连接,控件属性用weak
2).如果是采用纯代码搭建界面,控件可以使用strong进行修饰;因为此时控件的对象的两个强引用(ViewController的noLable,以及view的subview)都会随着控制器ViewController的销毁而被释放。

[self.view addSubview:_noLabel];
//将弱引用参照的_noLabel添加到视图UIViewUIViewController.h-》@property(null_resettable, nonatomic,strong) UIView *view;-》UIView.h :@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;-》强引用UILabel对象,所以这个UILabel对象已经有拥有者,不会被放--再添加过程都是操作UILabel对象的地址

day02-Strong&weak; 图片浏览器、tom 猫

  • oc中释放对象的过程

程序先对控制器进行释放,如果没有对象对View进行强引用,程序将对view进行释放,
内存中如果没有存在对subviews 的NSArray对象进行强引用,就释放subviews;
此时如果UILabel对象没有被强引用,UILabel对象将被释放

  • 其他情况下,

1)创建的自定义对象,都用strong。--因为这些对象不会有UIViewController的控制,来进行强引用
2)NSString 使用copy;NSString应该使用copy而不是strong的属性特性。为什么?即使你声明一个NSString的属性,有人可能传入一个NSMutableString的实例,然后在你没有注意的情况下修改它。
3)数字型的,比如int ,就是使用assign
*/

五、相同代码封装抽取的思路

1)将相同的代码放到一个新方法中
2)将不同的值(button.tag)当做方法的参数传递进来: 在oc 中通常方法的第一个参数为:触发该方法的对象 --根据需要进行参数调整
六、Apple推荐使用的图片格式:p n g
1。jpg, 常常放置于Supporting Files目录
1)压缩比 比较高,通常用于照片、网页
2)属于有损压缩(噪点noise)
3)解压时对c pu 消耗大--意味着,慢、费电
2.p n g 常常放置于Assets.xcassets目录中,作为控件的背景图片
1)压缩 较高,无损压缩,解压效率高,对CPU消耗少

七、 关于图像的实例化--OC程序员时刻要记着内存的管理
方式一、有缓存加载图片
无缓存加载图片

        //方式一:有缓存加载图片
+ (UIImage *)imageNamed:(NSString *)name 系统推荐使用的方法,但图像实例化之后的对象释放由系统负责。
//       [arrayImage addObject: [UIImage imageNamed:pictureNamePrefix]];//参数为图片名称,png 格式的可以不加扩展名

2.方式二:无缓存方式加载图片(提示、如果放置于Assets.xcassets目录中的图片不能使用imageWithContentsOfFile:path进行加载;只能使用imageName进行加载,即内存由系统负责了)
例如加载如下图片的代码实现:

//方式二:无缓存方式加载图片-指定扩展名
//        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]];

/Users/devzkn/Library/Developer/CoreSimulator/Devices/949ED3EA-A51B-4B5C-99B1-8069EB99E684/data/Containers/Bundle/Application/2B2B99A6-4FBC-4171-BE4F-ECA1B5AA2590/09-tomcat.app/angry_00.jpg

day02-Strong&weak; 图片浏览器、tom 猫

{      //开始动画
    [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];//@interface NSObject (NSDelayedPerforming)
}

- (void)cleanUpAnimationsArray{
    NSLog(@"%s ",__func__);
    //动画结束之后清除帧动画数组
    [self.imageList setAnimationImages:nil];

}

除内存的代码简化

 [self.imageList performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:self.imageList.animationDuration];

正文
--


1.修改头文件的问题解决方法:
只要进行/Users/devzkn/Library/Developer/Xcode/DerivedData 目录文件进行清理&commandB

2.常用快捷键
1)文件跳转栏:Control+6(键入方法/变量名+Enter跳转)
2)快速帮助: 在类或者方法名上执行Option + Left-click操
3)一次性修改一个scope里的变量名:
点击该变量,出现下划虚线,然后command+control+E**所有相同变量,然后进行修改。
4)删除一个词:option+delete
5)文件内快捷搜索:
先点亮想要搜索的词,然后command+E将该次放入剪贴板,然后command+G来向下遍历该词,shift+command+G向上遍历。
5)    前后两行交换:command+option+[ 或 ]
6)    不同窗口间切换:command+`
7)前进和后退:command+control+ → 或 ←
8)折叠代码块:command+option+ → 或 ←
9)debug:
下一行:F6、进入方法:F7、跳出方法:F8
全速执行:command+control+Y
clear debug console:command+K

 - tom 基本实现--序列帧动画

掌握的知识点、 
1)UIImageView 帧动画的使用 
2)UIImage的两种加载方式 
有缓存方式的加载方法 
无缓存方式将图片加载至内存  


3)重复代码的封装抽取:等优化完毕之后,在删除被优化的旧代码;常见的优化点有,数据独立性的处理(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];

}

总结

  • 重写getter 和setter方法的注意点

self.属性 和属性的区别: @property 生产一个变量名为带 的成员变量;直接读取成员变量不会经过getter&setter方法

1.重写getter方法的时候避免使用self.属性,否则将出现循环调用getter

2.解决问题1,就应该采用_属性进行成员变量的读取,直接读取成员变量不会经过getter&setter方法。

  • Strong&weak

(weak和strong)不同:
当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。  一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。
  例子:
  想象我们的对象是一条狗,狗想要跑掉(被释放)。  strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。  weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。

  • 自动补齐,数字的格式化

    NSString *pictureNamePrefix =[ NSString stringWithFormat:@”drink_%02d.jpg”,i];//不到两位的自动补零;不到两位的自动补零 %04d: 自动补齐四位,不足四位的,就在数字前面加0