YYKit 学习

YYImage的 YYAnimatedImageView 无法加载网络图片 前言:为了在tableview 中更刘畅的加载 gif图片 1、使用 SDWebImage 的 SDAnimatedImageView 加载 gif 图片,少量无伤大雅,可以使用,大量会导致卡顿、崩溃 2、使用 YYWebImage 的 YYAnimatedImageView 加载 gif 图片,效果非常好,在 tableview 里边中没有卡顿现象, 3、使用 swift 的 Kingfisher 中的 AnimatedImageView 加载 gif 图片,这个和 SDWebImage 效果相差不大 但 阅读详情

一、YYLabel

学习 YYTextAsyncExample,YYLabel 异步绘制效率要比UILabel高许多。

简单看下YYLabel实现原理:

1. YYLabel 设置 textLayout 属性;

2. YYLabel - setTextLayout

   a. 解析属性,

   b. 调用[self.layer setNeedsDisplay];

3. YYAsyncLayer

   a. display 被调用;

   b. 通过 YLAsyncLayerDelegate 生成一个 YYAsyncLayerDisplayTask;

   c. 分别调用 task.willDisplay, 线程异步调用 task.display, 主线程调用 task.didDisplay;

   d. display 后,生成UIImage,设置到self.contents;

4. YYLabel

   a. 实现 - (YYAsyncLayerDisplayTask*)newAsyncDisplayTask;

   b. 分别实现willDisplay,display,didDisplay 三个block;

   c. willDisplay 删除掉附加的view和layer;

   d. display 调整位置绘制文本;

   e. didDisplay layer添加动画;

 

二、YYAnimatedImageView

UITableViewCell 上添加 YYAnimatedImageView,实现异步加载,解码来提高效率。
1. setImageWithURL:placeholder:options:progress:transform:completion
   该方法为UIImageView+YYWebImage里实现的方法
   a. 生成 _YYWebImageSetter(对下载的简单封装),取消当前URL下载,生成新的sentinel;
   b. 通过 YYImageCache 获取内存缓存,存在,设置image,返回;
   c. 设置默认图片;
   d. 通过 _YYWebImageSetter 提供的队列(串行)异步执行 setter 的 setOperationWithSentinel 方法;
2. _YYWebImageSetter - setOperationWithSentinel
   a. 通过YYWebImageManager 创建一个 NSOperation;
   b. 取消之前的 operation,生成新sentinel并返回;
   c. 通过dispatch_semaphore_wait / signal 保证线程同步;
3. YYWebImageManager - requestImageWithURL
   a. 生成NSMutalbeURLRequest,并以参数形式生成 YYWebImageOperation;
   b. 如果有用户名,密码,operation 设置 credential;
   c. 加入到 _queue 中;
4. YYWebImageOperation
   a. start,在新线程上运行 _startOperation; 并通过 UIApplication beginBackgroundTaskWithExpirationHandler 在进入后台时,取消任务;
   b. a中新线程的创建:
      . NSThread initWithTarget:selector:object;
      . _networkThreadMain: 中运行 runloop,设置addPort:[runLoop addPort:[NSMachPort port] forModel:NSDefaultRunLoopMode];
      . 这个线程会一直存在,代码里并没有在任务完成后removePort;
   c. _startOperation
      . YYImageCache 中读取内存缓存,存在,结束,返回;本地读取,有,返回;
      . 线程执行_startRequest;
   d. _startRequest
      . 通过 request 生成 NSURLConnection;
5. NSURLConnectionDelegate
   执行顺序依次:
      - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
      获取到size,创建大小相同的data;
      - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
     append data;
     如果有渐进显示标记,会把当前拿到的数据生成image,返回,用来显示当前拿到的数据;
      - (void)connectionDidFinishLoading:(NSURLConnection *)connection;
      接收完成,生成UIImage,解码;
      缓存,返回,设置image;
6. 其他
   YYWebImageOperation 里用的递归锁;
   加入了黑名单功能,如果设置IgnoreFailedURL标记,之前失败过的url不在重新下载;


三、YYCache

高效率,多功能,分析如下:

1. YYMemoryCache

   a. 数据存储为_YYLinkMap;

   b. 线程锁用的pthread_mutex_t;

   c. 队列为串行队列;

   e. 可设置costLimit,countLimit,ageLimit;

   f. 监听消息:UIApplicationDidReceiveMemoryWarningNotification,UIApplicationDidEnterBackgroundNotification;收到消息后并且设置相关标记后,remove所有对象;

   g. 设置了个5s定时器,检测cost、count、age,超过限制时,自动清理;

   h. _YYLinkMap 使用Core Foundation, CFMutableDictionaryRef _dic,提高效率;

   i. _YYLinkMap 包含 head,tail,结构为双向链表;

2. YYDiskCache



四、YYDispatchQueuePool



【WorkBuddy专栏50】代码开发技术体系深度分析——前端、后端、全栈、移动端、数据工程,WB和CODEBUDDY谁更擅长? 阅读详情

相关推荐

Kubernetes+EdgeX:构建企业级AI边缘推理平台

设备:工业摄像头(RTSP协议,输出1920x1080视频流);AI模型:YOLOv8训练的轴承裂纹检测模型(识别“裂纹”“正常”两种类型);目标:摄像头采集图像→EdgeX传输数据→K8s推理服务检测→结果反馈到报警器(HTTP协议)。Kubernetes+EdgeX的组合,为企业构建AI边缘推理平台提供了标准化、可扩展标准化:K8s的容器编排和EdgeX的设备管理,都是行业标准,避免“重复造轮子”;可扩展:支持从单边缘节点到 thousands of nodes 的规模,满足企业的增长需求;

AI算力网络与通信的博客 1343

iOS加载WebP

遇到场景:首先直播需要展示 礼物(会动的礼物) 解决:按之前的考虑是 加载 gif , 但是gif 会产生锯齿导致礼物不好看,最后我们想到了webp , 我们将 UI 设计好的 png 几个帧数 合成了webp 格式。 加载webp 我使用的是 YYWebImage 首先加载执行 pod 'YYWebImage', '~> 1.0.5' 跟着执行 pod 'YYImage/Web...

xixi 5408

Unity序列帧动画输出全攻略:Recorder+Timeline实战与透明通道处理

序列帧动画是游戏开发、影视动画和UI动效中的基础技术,指将连续动作分解为一系列静态图像并按序播放,形成动态视觉效果。其原理是通过时间轴精确控制每一帧的内容与时机,实现动画的逐帧呈现。在实时渲染领域,序列帧输出技术价值显著,它能够将动态内容高质量地转换为静态图像序列,便于跨平台复用、后期合成与资源分发。应用场景广泛,包括角色动画导出、技能特效制作、宣传片素材生成等。本文聚焦Unity引擎,深入解析如何利用Recorder与Timeline工具链,高效输出带Alpha透明通道的PNG序列帧,并重点攻克透明通道处

weixin_31556767的博客 327

使用YYAnimatedImageView加载GIF图,并且可以控制只播放一次

1.初始化YYAnimatedImageViewYYAnimatedImageView *imageView = [[YYAnimatedImageView alloc] init];imageView.backgroundColor = [UIColor whiteColor];imageView.contentMode = UIViewContentModeScaleAspectFit;[se...

weixin_30794491的博客 1398

Kali Linux实战:5分钟复现永恒之蓝漏洞攻击(附Win7靶机配置指南)

本文提供了一份详细的Kali Linux实战指南,指导读者在5分钟内于隔离的虚拟环境中复现经典的永恒之蓝漏洞攻击。内容涵盖从Windows 7靶机配置、网络设置,到使用Nmap进行服务发现、利用Metasploit框架进行漏洞扫描与利用的全过程,并演示了基础的Meterpreter后渗透操作,旨在帮助网络安全学习者通过亲手实践深入理解SMB协议漏洞的攻防原理。

weixin_29313547的博客 194

【板栗糖GIS】新装ArcGIS必调的12个隐藏设置——【效率翻倍指南】

本文详细介绍了新装ArcGIS后必调的12个隐藏设置,涵盖性能优化、路径管理、显示调校、工作流定制等方面,帮助用户显著提升GIS工作效率。从关闭后台地理处理到启用硬件加速,再到个性化快捷键配置,这些实用技巧能让ArcGIS运行更流畅,操作更便捷。

weixin_42524945的博客 543

YYWebImage使用

YYWebImage 是一个异步图片加载框架 (YYKit 组件之一), 性能相对较高,下面来简单说一下。 **特性**: 异步的图片加载,支持 HTTP 和本地文件。 支持 GIF、APNG、WebP 动画(动态缓存,低内存占用)。 支持逐行扫描、隔行扫描、渐进式图像加载。 UIImageView、UIButton、MKAnnotationView、CALayer 的常见图片处理:模糊、圆角、

雁过留声的博客 6477

Windows server Database 2025 安装 i225/i226 网卡驱动

Windows server Database 2025 安装 i225/i226 网卡驱动 windows这比坏得很,intel消费级网卡不准在服务器系统上安装。你要说他是异构不支持?他就纯粹恶心人。 之前已经安装过一次,但是今天database预览版一更新,又给我把网卡驱动杀了,气死,写一篇教程。 到这里就完成了,总之还是想辱骂windows,提供便捷的同时又人为制造困难,多少有点(隔壁linux内核直接自带全家桶了就一省心) 并且近年Intel的新U安装显卡驱动和普通声卡驱动都不会出声

低温热源的博客 1万+

YYImage加载gif动态图原理

其中用到了一个宏,__FLT_EPSILON__是1.19209290E-07F, 可以认为是趋向于0对比. 当传入1时,直接返回string的原值 当scale传入2,或者3时, 返回的是icon@2x 或者 icon@3x static NSString *_NSStringByAppendingNameScale(NSString *string, CGFloat scale) { if (!string) return nil; // __FLT_EPSILON__是1...

gcs的博客 4672

NA400与昆仑通态MODBUS/TCP通讯调试说明

点击增加设备通道,弹出窗口进行设置,通道类型选择“0区输出继电器”,通道地址为1,通道个数为1,读写方式为读写。点击增加设备通道,弹出窗口进行设置,通道类型选择“4区输出寄存器”,数据类型选择“16位 无符号二进制”,通道地址为21001,通道个数为1,读写方式为读写。5.添加设备通道:双击莫迪康MODBUSTCP子设备,点击添加设备通道,根据Modbus规约地址表进行参数的设置,表格可在NAPro软件帮助中查看,如下图所示。然后可以在设备通道调试数据中观察到Q1的值为1,NW1的值678,表示通讯成功。

weixin_44281509的博客 2490

Unreal5从入门到精通之如何录制360°VR全景视频

摘要:本文详细介绍了使用虚幻引擎(UE)生成360°全景视频的完整流程。首先需启用MovieRender Queue和Panoramic Capture插件,准备场景并设置相机序列。通过影片渲染队列选择8K分辨率输出PNG序列帧,利用ffmpeg工具转换为MP4格式,最终获得高精度全景视频。该方法适用于VR内容开发,能以较低性能消耗实现影院级画质,特别适合冥想类应用场景。教程涵盖从插件配置到后期合成的全链路操作,为开发者提供高效的全景内容生产解决方案。(150字)

TxNet 1401

YYKit 学习笔记之 YYLabel

YYKit

xu_yu_jie的博客 5268

WebRTC之beamforming算法

CSND已永久停更,最新版唯一来源点击下面链接跳转: 语音增强和语音识别网页书 坐标问题 这里以笔记本为例进行说明,当笔记本按如下方式打开: 首先是键盘和液晶屏呈90度,然后鼠标上方,也就是液晶屏上方正中间是camera,把平行于键盘的面看成是xy平面,把液晶屏所在的面看成是xz平面,所有平面的原点都在Camera的位置。 方位角:从原点开始,Camera的右侧是0度,逆时针方...

shichaog的专栏 1万+

YYKit学习系列 ---- 开篇

准备花半年时间系统学习YYKit, 学习过程会放入"YYKit学习系列"这个分类, 喜欢YYKit的可以随时留意我的文章, 一起学习!!! 转载于:https://www.cnblogs.com/bigshow1949/p/6089815.html...

weixin_30763455的博客 71

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

YYKit源码学习——YYMemoryCache

YYKit是在项目开发中经常使用的一个库,我很膜拜作者,很惭愧,同样身为90后,差距实在太大了,别人这么牛逼,我却如此菜鸡,我也知道,到了一定程度,人就会遇到技术瓶颈,对于我,提高自己水平的惟一方法就是阅读源代码,我也一直很想这样学习,下载了很多源代码,但却一直无法静下心来学习,看到那长篇大幅的英文字母就头痛,今日公司无事,于是又瞥见桌面上的YYKit文件夹,于是打开了看一看,挑选了代码比较...

人生如梦 1248

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

iOS YYKit学习之YYText的使用

前文 hihi,勇敢的小伙伴儿们大家好,好久不见~ 前段时间因为各种琐事缠身再加上情绪十分不稳定,所以未能及时与大家分享知识。 今天分享的是很出名的一个库了,是很久很久以前用的,想来还是分享一下比较合适,这个库就是YYKit,今天分享其中的YYText的使用~ 在我很早之前有一篇博客iOS 把你的UILabel多彩起来实在是太简单了,已经不适合用很多场景,现在的Label一个比一个复杂,面对...

王颜华的博客 1万+

YYKit学习笔记

概述 YYKit是集大成者的第三方表现,堪称国内最优秀的框架。因此,在YYKit中有太多的技术点值得挖掘思考,本文用来记录YYKit源码阅读中的心得以及认为有价值的技术点 QoS The following Quality of Service (QoS) classifications are used to indicate to the system the natur

j_AV_a的博客 5862

YYKit 源码学习使用 1

先上代码地址YYKit 唐巧:专访YYKit作者郭曜源 因为有中文注释,看起来还是很方便的(我就是个英语渣,当然代码中没中文哟) ###YYImage 先来看YYImage YYImage.h 一个UIImage类型的YYImage,可以添加不同格式图片。 YYSpriteSheetImage.h 一个图片的内容为分布矩阵显示成动画的Image。 YYFrameImage.h 一个将多张图...

weixin_33756418的博客 144

YYKit框架使用学习之整理

前段时间朋友聚会, 听说YYKit 是一组庞大、功能丰富的 iOS 组件。回来后立即搜索下载学习, 这个不得不承认, YYKit作者郭曜源好厉害, 此框架真心! 现将自己的学习心得整理如下, 希望有所帮助! 下载链接: https://github.com/ibireme/YYKit 为了尽量复用代码,这个项目中的某些组件之间有比较强的依赖关系。为了方便开发者使用,YYKit作者郭曜源从中拆分...

weixin_34375251的博客 392

第三方框架学习—YYKit

ibireme和YYKit 可以看一下唐巧对ibireme的采访 搜索一下ibireme的微博 简言之,渴望成为iOS大牛的新人,只有两条捷径,一是大量地阅读优秀项目的源代码,另一个就是自己动手实践来尝试。 YYKit YYKit 是一组庞大、功能丰富的 iOS 组件。 为了尽量复用代码,这个项目中的某些组件之间有比较强的依赖关系。为了方便其他开发者使用,我从中拆分出以下独立组件:

bluewindaa的专栏 2393

iOS开发学习之YYKit中YYText的深入解析,YYTextShadow的代码解析

上面的阴影效果是用这样的代码实现的: 可以看到先生成了 YYTextShadow, 然后赋值给了 attributedString 的 yy_textShadow,然后再把 attributedString 赋值到 YYLabel 里面,接着把 YYLabel 加入到 UIView 里来显示。跟踪 yy_textshadow 发现,主要是把 textShadow 绑定到了 N

zhonggaorong的专栏 7880

YYKit(Base模块)学习笔记

Base 1.看到weakify和strongify这两个宏定义如下: #ifndef weakify #if DEBUG #if __has_feature(objc_arc) #define weakify(object) autoreleasepool{} __weak __typeof(object) weak##_##object = object; #else ...

weixin_34308389的博客 496

专访 YYKit 作者 Ibireme: 开源大牛是怎样炼成的

专访 YYKit 作者 Ibireme: 开源大牛是怎样炼成的 版权说明 本文为InfoQ中文站特供稿件,首发地址为:文章链接。如需转载,请与InfoQ中文站联系。 前言 第一次听到 ibireme 这个名字,是看到他在 微博上分享 了 YYText 开源库。当时我第一眼见到 YYText 的功能示意 GIF 图时(下图所示),就被它丰富的功能吸引了。Y

江湖两把刀的技术博客 3883

Objective-C中C语言使用初步学习(2)

最近在进行iOS的深入学习,看过一些博客后意识到自己的代码写的过于臃肿。我从开始学习到现在的业务熟练都是使用的最基本的MVC模式,于是MVC中的C--controller代码十分臃肿,让接手代码的人无从下手。在网上查阅多篇博客后,才了解到有多种设计模式,虽然各有缺点,但是能让我借鉴到许多方法;然后还找到很多模块,比如YYKit等,可以优化、简化复杂的代码模块和逻辑。 现在我就在学习YYKit,发...

u012380572的博客 267

YYCategory 学习笔记

今天趁着空 学习了下 YYKit 中的 Base 感觉大受启发 学习了很多新的知识 现记录下所学的知识, 防止以忘记 NSObject+YYAdd 中的 - (nullable id)performSelectorWithArgs:(SEL)sel, …; 方法的实现很厉害 学习下!!! // - 让函数可以调用的宏定义 #define INIT_INV(_last_arg_, _return...

Coder 852

刀客传奇博客目录

23 种设计模式算法简单学习AFNetworking 源码探究YYKit 源码探究

weixin_34283445的博客 174
上一篇: SDWebImage 学习
下一篇: Xcode 技巧
直隶码农
博客等级 码龄19年 95粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值