nodejs做网站能保护源代码吗/如何做电商 个人

nodejs做网站能保护源代码吗,如何做电商 个人,abspath wordpress,横沥网站仿做小蓝书学习(七) 前言第47条:熟悉系统框架第48条:多用枚举块,少用for循环第50条:构建缓存使选用NSCache而非NSDictionary第51条:精简initialize与load的实现代码第52条:别忘了NSTimer…

小蓝书学习(七)

  • 前言
  • 第47条:熟悉系统框架
  • 第48条:多用枚举块,少用for循环
  • 第50条:构建缓存使选用NSCache而非NSDictionary
  • 第51条:精简initialize与load的实现代码
  • 第52条:别忘了NSTimer会保留其目标对象

前言

虽然不使用系统框架也可以写出OC代码,但几乎没有人这么做,即便我们经常使用的NSObecj这个标准的根类,也是属于Foundation框架,而非语言本身。

第47条:熟悉系统框架

将一系列代码封装成动态库,并在其中放入描述其接口的头文件,这样做出来的东西就是框架。

有时为iOS平台构建的第三方框架所使用的是静态库,这是由于iOS应用程序中不允许在其中包括动态库。这些东西严格意义上来说不是真正的框架。

开发者碰到的主要框架就是Foundation,例如NSObject,NSArrayNSDictionary 等类都在其中。该框架中的类都是NS这个前缀,同时这个框架也是OC应用程序的“基础”。

CoreFoundation
这个框架与Foundation框架相伴,从技术上来讲,这个框架并不是一个OC框架,但是它是编写OC应用程序时所应熟悉的重要框架,Foundation框架中的许多功能,都可以在这个框架中找到对应的C语言API。
无缝桥接这个功能可以把CoreFoundation中的C语言数据平滑的转化为Foudation中的OC对象,例如Foundation中的NSStringCoreFoundation中的CFString

除了这些数据库以外,还有很多系统库,下面这张图片进行展示(包括但不限于这些):
在这里插入图片描述
通过上面这几个系统库可以看出,OC很重要的一个特点就是,经常需要使用底层的C语言API。用C语言实现API的优点是:可以绕过OC的运行期系统,从而提升执行速度

要点

  • 许多系统框架都可以直接使用,其中最重要的是FoundationCoreFoundation,这两个框架提供了构建应用程序所需的许多核心功能。
  • 很多常见任务都能用框架来做,比如音频与视频处理、网络通信、数据管理等
  • 请记住:用纯C语言所写的框架和OC写成的一样重要,如果想成为优秀的OC开发者,对于C语言的核心概念应该熟悉掌握。

第48条:多用枚举块,少用for循环

在编程中经常需要列举collection,当前的OC语言中有许多办法来实现这个功能。通常有标准的C语言循环、OC1.0中的NSEnumerator以及OC2.0中的快速枚举,在引入块这一概念之后,还有几种新的方法。

for循环

for (int i = 0; i < objects.count; i++) {/* ... */ 
}

使用OC1.0中的NSEnumerator遍历

NSEumerator是一个抽象基类,其中只定义了两个方法:

- (NSArray*) allobjects
- (id) nextObject//这个方法比较关键,每次调用这个方法,内部都会更新,知道末端下一个返回nil,表示达到了末端。

这里笔者以遍历数组为例:

NSArray* anArray = /* ... */
NSEumerator* enumerator = [anArray objectEnumerator];
id object;
while ((object = [enumerator nextobject]) != nil) {/* ... */
}

快速遍历

快速遍历是使用for...in来实现。具体操作为:

NSArray* arr = /* ... */
for(id object in arr) {/* ... */
}

基于块的遍历方式
在当前OC语言中,最新引入的一种做法就是基于块来遍历。NSArray中定义了下面这个方法,他可以实现基本的遍历功能:

-(void) enumerateObjectsUsingBlock:(void(^)(id obj, NSUInteger idx, BOOL * _Nonnull stop))block

当我们遍历字典与set的时候:

NSDictionary* aDictionary = /* ... */aDictionary enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {}

使用该方法来遍历的另一个好处就是,能够更改块的方法签名,以免进行类型转换操作,从效果上来讲,相当于把本来要执行的类型转换操作交给块方法签名来做。

在这里插入图片描述
使用这个方法也可以执行反向遍历。数组、字典、set都实现了前述方法的另一个版本,令开发者可以向其转入“选项掩码”
在这里插入图片描述
要点:

  • 遍历collection有四种方式。最基本的办法是 for循环,其次是NSEnumerator遍历法及快速遍历法,最新、最先进的方式则是“块枚举法”。
  • “块枚举法”本身就能通过GCD 来并发执行遍历操作,无须另行编写代码。而采用其他遍历方式则无法轻易实现这一点。
  • 若提前知道待遍历的collection含有何种对象,则应修改块签名,指出对象的具体类型。

第50条:构建缓存使选用NSCache而非NSDictionary

当我们开发应用程序时,需要从网络上下载图片时,我们通常会选择将图片保存到字典中,但是,其实在Foundation框架下,有一个类NSCache更好,它是该框架专门为处理这种任务而设计的。

NSCache胜过NSdictionary的地方在于,当系统资源即将耗尽的时候,它可以自动删减缓存。如果使用普通的字典,就要自己编写挂钩,在系统发出“低内存”通知手动删减缓存。而NSCache则会自动删减,由于其是foundation框架的一部分,所以与开发者相比,他能在更深的层面插入挂钩。同时,NSCache会删减“最久未使用的”对象。

NSCache并不会“拷贝”键,而是会“保留”它。此行为用NSDictionary也可以实现然而需要编写相当复杂的代码。NSCache对象不拷贝键的原因在于:很多时候,键都是由不支持拷贝操作的对象来充当的。因此,NSCache不会自动拷贝键,所以说在键不支持拷贝操作的情况下,该类用起来比字典更方便。另外,NSCache是线程安全的而NSDictionary则绝对不具备此优势,意思就是:在开发者自己不编写加锁代码的前提下多个线程便可以同时访问NSCache。对缓存来说,线程安全通常很重要,因为开发者可能要在某个线程中读取数据,此时如果发现缓存里找不到指定的键,那么就要下载该键所对应的数据了。而下载完数据之后所要执行的回调函数,有可能会放在背景线程中运行,这样的话,就等于是用另外一个线程来写入缓存了。

要点

  • 实现缓存时应选用NSCache而非NSDictionary对象。因为NSCache可以提供优雅的自动删减功能,而且是“线程安全的”,此外,它与字典不同,并不会拷贝键。
  • 可以给NSCache对象设置上限,用以限制缓存中的对象总个数及“总成本”,而这些尺度则定义了缓存删减其中对象的时机。但是绝对不要把这些尺度当成可靠的“硬限制”它们仅对NSCache 起指导作用。
  • NSPurgeableDataNSCache搭配使用,可实现自动清除数据的功能,也就是说,当NSPurgeableData对象所占内存为系统所丢弃时,该对象自身也会从缓存中移除。
  • 如果缓存使用得当,那么应用程序的响应速度就能提高。只有那种“重新计算起来很费事的”数据,才值得放入缓存,比如那些需要从网络获取或从磁盘读取的数据。

第51条:精简initialize与load的实现代码

load方法
原型:+ (void) load

对于加入运行期系统中的每个类及分类来说,必定会调用此方法,而且仅调用一次,执行顺序为:先调用类再调用分类。
在执行load方法时,整个运行期系统都处于“脆弱状态”。在执行子类的load方法之前必定会先执行所有超类的load方法。故而在load方法中使用其他类是不安全的。
这时候我们可以使用initialize方法。

initialize方法
对于每个类来说,该方法会在程序首次用该类之前调用,且只调用一次。他与load调用有几个微妙区别:

  • 惰性调用:只有当程序用到了相关的类时,才会调用。等于说应用程序不用先把每个类的initialize都执行一遍。
  • 运行期系统在执行该方法时,处于正常状态。
  • initialize方法与其他消息一样,如果某个类未实现它,而期超类实现了,那么就会运行超类的实现代码。

要点

  • 在加载阶段,如果类实现了load方法,那么系统就会调用它。分类里也可以定义此方法,类的load方法要比分类中的先调用。与其他方法不同,load方法不参与覆写机制。
  • 首次使用某个类之前,系统会向其发送initialize消息。由于此方法遵从普通的覆写规则,所以通常应该在里面判断当前要初始化的是哪个类。
  • loadinitialize方法都应该实现得精简一些,这有助于保持应用程序的响应能力,也能减少引入“依赖环”的几率。
  • 无法在编译期设定的全局常量,可以放在initialize方法里初始化。

第52条:别忘了NSTimer会保留其目标对象

计时器是一种很方便也很有用的对象。Foundation框架中有一个NSTimer,开发者可以指定绝对的日期与时间,以便到时间可以执行任务。但是计时器会保留目标对象,所以反复的执行任务通常会导致应用程序出现问题。下面展示一段代码:
在这里插入图片描述
这样写代码会存在一个保留环的问题,下面展示一个图来演示这种情况:
在这里插入图片描述
那么这个问题我们可以通过块来解决。虽然计时器当前并不直接支持块,但是可以用下面这段代码来解决问题:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SyntaxError: positional argument follows keyword argument

命令行里面日常练手爬虫不注意遇到的问题&#xff0c;报错说参数位置不正确 修改代码后&#xff0c;运行如下图&#xff1a; 结果&#xff1a; 希望各位也能顺利解决问题&#xff0c;祝你好运&#xff01;

drawDB:一款免费数据库设计工具

drawDB 是一款基于 Web 的免费数据库设计工具&#xff0c;通过拖拽、复制、粘贴等方式进行数据库建模设计&#xff0c;同时可以生成相应的 SQL 脚本。 功能特性 drawDB 目前可以支持 MySQL、MariaDB、PostgreSQL、SQL Server 以及 SQLite 数据库&#xff0c;核心功能包括&…

FPGA开发,使用Deepseek V3还是R1(9):FPGA的全流程(详细版)

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

Hive-05之查询 分组、排序、case when、 什么情况下Hive可以避免进行MapReduce

一、目标 掌握hive中select查询语句中的基本语法掌握hive中select查询语句的分组掌握hive中select查询语句中的join掌握hive中select查询语句中的排序 二、要点 1. 基本查询 注意 SQL 语言大小写不敏感SQL 可以写在一行或者多行关键字不能被缩写也不能分行各子句一般要分行…

人工智能之数学基础:矩阵的范数

本文重点 在前面课程中,我们学习了向量的范数,在矩阵中也有范数,本文来学习一下。矩阵的范数对于分析线性映射函数的特性有重要的作用。 矩阵范数的本质 矩阵范数是一种映射,它将一个矩阵映射到一个非负实数。 矩阵的范数 前面我们学习了向量的范数,只有当满足几个条…

I2C驱动(十一) -- gpio模拟的i2c总线驱动i2c-gpio.c分析

相关文章 I2C驱动(一) – I2C协议 I2C驱动(二) – SMBus协议 I2C驱动(三) – 驱动中的几个重要结构 I2C驱动(四) – I2C-Tools介绍 I2C驱动(五) – 通用驱动i2c-dev.c分析 I2C驱动(六) – I2C驱动程序模型 I2C驱动(七) – 编写I2C设备驱动之i2c_driver I2C驱动(八) – 编写I2C…

(KTransformers) RTX4090单卡运行 DeepSeek-R1 671B

安装环境为&#xff1a;ubuntu 22.04 x86_64 下载模型 编辑文件vim url.list 写入如下内容 https://modelscope.cn/models/unsloth/DeepSeek-R1-GGUF/resolve/master/DeepSeek-R1-Q4_K_M/DeepSeek-R1-Q4_K_M-00001-of-00009.gguf https://modelscope.cn/models/unsloth/Dee…

海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)

1.首先说了一下为什么要用ISUP协议来取流 ISUP主要就是用来解决摄像头没有公网ip的情况,如果摄像头或者所在局域网的路由器有公网ip的话&#xff0c;其实采用rtsp直接取流是最方便也是性能最好的&#xff0c;但是项目的摄像头没有公网IP所以被迫使用ISUP&#xff0c;ISUP是海康…

SpringBoot原理-03.自动配置-方案

一.自动配置原理 探究自动配置原理&#xff0c;就是探究spring是如何在运行时将要依赖JAR包提供的配置类和bean对象注入到IOC容器当中。我们当前准备一个maven项目itheima-utils&#xff0c;这里面定义了bean对象以及配置类&#xff0c;用来模拟第三方提供的依赖&#xff0c;首…

高频 SQL 50 题(基础版)_2356. 每位教师所教授的科目种类的数量

高频 SQL 50 题&#xff08;基础版&#xff09;_2356. 每位教师所教授的科目种类的数量 select teacher_id ,count(distinct(subject_id)) as cnt from Teacher group by teacher_id

神经网络之词嵌入模型(基于torch api调用)

一、Word Embedding&#xff08;词嵌入&#xff09;简介 Word Embedding&#xff08;词嵌入&#xff09;&#xff1a; 词嵌入技术是自然语言处理&#xff08;NLP&#xff09;领域的一项重大创新&#xff0c;它极大地推动了计算机理解和处理人类语言的能力。 通过将单词、句子甚…

SpringBoot @Value 注解使用

Value 注解用于将配置文件中的属性值注入到Spring管理的Bean中。 1. 基本用法 Value 可以直接注入配置文件中的属性值。 配置文件 (application.properties 或 application.yml) 配置文件定义需要注入的数据。 consumer:username: lisiage: 23hobby: sing,read,sleepsubje…

Redis面试常见问题——使用场景问题

目录 Redis面试常见问题 如果发生了缓存穿透、击穿、雪崩&#xff0c;该如何解决&#xff1f; 缓存穿透 什么是布隆过滤器&#xff1f; 缓存击穿 缓存雪崩 双写一致性&#xff08;redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&#xff1f;&#xff09; …

在Ubuntu 22.04 LTS 上安装 MySQL两种方式:在线方式和离线方式

Ubuntu安装MySQL 介绍&#xff1a; Ubuntu 是一款基于Linux操作系统的免费开源发行版&#xff0c;广受欢迎。它以稳定性、安全性和用户友好性而闻名&#xff0c;适用于桌面和服务器环境。Ubuntu提供了大量的软件包和应用程序&#xff0c;拥有庞大的社区支持和活跃的开发者社区…

用Java编写sql

1.概念 通过Java代码操作mysql数据库 数据库编程&#xff0c;是需要数据库服务器&#xff0c;提供一些API&#xff0c;供程序员调用的 2.安装 2.1下载 在程序中操作mysql需要先安装mysql的驱动包 并且要把驱动包引入到项目中 在中央仓库可以下载到驱动包(mvnrepository.…

Redis数据结构-List列表

1.List列表 列表类型适用于存储多个有序的字符串&#xff08;这里的有序指的是强调数据排列顺序的重要&#xff0c;不是升序降序的意思&#xff09;&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;一个列表最多可以存储2^32-1个元素。在R…

Linux实操——在服务器上直接从百度网盘下载(/上传)文件

Linux Linux实操——在服务器上直接从百度网盘下载&#xff08;/上传&#xff09;文件 文章目录 Linux前言一、下载并安装bypy工具二、认证并授权网盘账号三、将所需文件转移至目的文件夹下四、下载文件五、上传文件六、更换绑定的百度云盘账户 前言 最近收到一批很大的数据&…

题解 | 牛客周赛82 Java ABCDEF

目录 题目地址 做题情况 A 题 B 题 C 题 D 题 E 题 F 题 牛客竞赛主页 题目地址 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 做题情况 A 题 判断字符串第一个字符和第三个字符是否相等 import java.io.*; import java.math.*; import java.u…

基金 word-->pdf图片模糊的解决方法

1. 首先需要Adobe或福昕等pdf阅读器。 2. word中 [文件]--[打印]&#xff0c;其中打印机选择pdf阅读器&#xff0c;例如此处我选择福昕阅读器。 3. 选择 [打印机属性]--[编辑]--[图像]&#xff0c;将所有的采样、压缩均设置为 关闭。点击[另存为]&#xff0c;保存为 基金报告…

基于RKNN的嵌入式深度学习开发(2)

上一个章节我们介绍的RKNN模型的模型转换和模型的推理&#xff0c;这一章节我们将介绍模型的量化和评估部分。 2.3 RKNN模型的量化 量化就是将浮点转换为定点运算的过程&#xff0c;或者训练后由rknn来量化。量化模型使用较低精度&#xff08;如int8/uint8/int16&#xff09;保…