首页 文章 精选 留言 我的

精选列表

搜索[企业级UI],共10000篇文章
优秀的个人博客,低调大师

《企业级ios应用开发实战》一3.3 MVC模式

3.3 MVC模式 MVC模型是应用程序设计者们普遍采用的一种设计模式,在第2章介绍Cocoa Touch框架时曾简单介绍了MVC。MVC模式把应用程序GUI代码根据功能拆分为不同的类或组件:“模型”:用于封装应用程序的数据;“视图”:负责显示和编辑数据:“控制器”:负责处理前两者之间的逻辑关系。它们之间的逻辑关系参考第2章的图2-3。Cocoa Touch本身也遵循MVC模型原则。在MVC模型下,3个层次都由截然不同的类来实现,编写任何类的代码都应当明显地归为其中一类,并且其大部分功能代码不应当属于另外两类。这种分工负责的方式使得程序易于设计、实现和维护。一般情况下,我们会在Interface Builder中创建视图组件(关于Interface Builder的使用,我们会在第5章中进行介绍)。或者,使用Xcode通过代码的方式继承已有的视图和控件。模型负责保存应用程序数据,通常我们使用Objective-C对象或者Core Data来构建模型组件。控制器组件可以使用UIKit控件中的ViewController及其子类,或者是完全由程序员自已定制的类。从第4章开始,我们将开始在iOS应用程序开发中逐步应用MVC模型的基本理论来构建应用程序框架。始终遵循MVC模型的基本理论,将有助于你创建出更加简洁、易于维护的代码。

优秀的个人博客,低调大师

《企业级ios应用开发实战》一3.5 块编程

3.5 块编程 C语言的运行时特性中包括了块,标准C工作组的 N1370: Apple’s Extensions to C 中(其中也包括垃圾回收)对块进行了定义。作为C语言的扩展,Objective-C在OSX 10.6及iOS 4.0以后支持块语法。块运行时也会被集成到LLVM的compiler-rt子项目存储库中。 3.5.1 块的特点 一些面向对象的动态语言如ruby、groovy,都提供了对块的支持(在groovy中,块被称作为闭包“closure”)。块是用一对{}括号括起来的多个语句的集合。类似于函数,但不同于函数,可以把块作为表达式或变量的一部分,或者作为参数传递。在作为参数传递块时,代码被作为数据的一部分进行传递。块具有以下特征:同函数一样,有类型化参数列表。有返回结果或者要申明返回类型。能获取同一作用域(与块所在同一作用域)内的状态。可以修改同一作用域的状态(变量)。与同一范围内的其他块同享变量。在作用域释放后能继续共享和改变同一范围内的变量。除以上特点外,甚至可以复制块并传递到其他后续执行的线程,编译器和运行时负责把所有块引用的变量保护在所有块的拷贝的生命周期内。当然,这已经超出了本章的范围,可以参考苹果官方文档来了解这些内容。 3.5.2 Objective-C 中的块 对于C和C++,块是变量,但对于Objective-C,块仍然是对象。下面简单介绍Objective-C中的块。1.块变量声明用^操作符声明一个块变量的开始,分号表示块结束,如下代码所示: int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num multiplier; }; 块语法比较奇怪,块变量声明的解释如图3-2所示。 块变量的声明语句从前至后分为了几部分:返回值类型,如int、double,如果未显式地声明块的返回值类型,可能会自动从块代码中推断返回类型(通过return语句)。块变量名用括号括住,块变量名前加^符号。参数类型用括号括住,多个参数以逗号分隔,如果参数列表为void,而且返回类型依靠推断,可以省略参数列表的void。等号,将后面的块赋值给前面的块变量(即myBlock)。以^开头并以;结束的块定义。块定义中又分为以下两个部分(除去开头的^和结尾的;外):参数列表,同函数的参数列表。块体,同函数体。值得注意的是,块可以使用同一作用域内定义的变量,而函数不行。一旦声明了块,你可以像使用函数一样调用它: int multiplier = 7; int (^myBlock)(int) = ^(int num) { return num multiplier; }; printf ( "%d", myBlock(3)); 2.行内块有时候,你不准备重复使用某个块,因此你不必为它想一个名称。那你可以使用行内块而不用声明为块变量。以下代码来自苹果文档:// gsort_b类似标准的 gsort_r 函数,但它最后一个参数是一个块。 char myCharacters[3] = { "TomJohn", "George", "Charles Condomine" }; qsort_b(myCharacters, 3, sizeof(char ), ^(const void l, const void r) { char left = (char )l; char right = (char )r; return strncmp(left, right, 1); }); // myCharacters 现在是 { "Charles Condomine", "George", TomJohn" } 在qsort_b 方法调用中,第4个参数就是一个匿名的块(行内块)。匿名块跟块变量不同,它没有变量名,因此你无法重用匿名块。下次调用这个块时,必须把整个块定义的代码再复制一遍。3.__block关键字块允许访问本地变量。这很重要。它使得我们在线程间共享变量变得简单,而且,你可以规定一个本地变量是否可以写,这可通过使用__block关键字,这是一种类类似register、auto和static存储类型修饰符。用__block修饰的变量,可以在所有同一作用域内的块,以及块复制之间共享数据。在指定作用域内的多个块能同时使用共享变量。如同块,__block变量也使用栈存储。如果使用block_copy拷贝块(或者向块发送copy消息),变量被拷贝到堆里。而且,__block变量的地址随后就会改变。__block变量有两个限制:不能是可变长度的数组,也不能是包含C99可变长度数组的结构体。下面显示了__block变量的使用: __block int x = 123; // x 是块可写的 void (^printXAndY)(int) = ^(int y) { x = x + y; printf("%d %d\n", x, y); }; printXAndY(456); // 打印出: 579 456 // x 现在的值是:579 下面显示了在块中使用多种类型的变量: extern NSInteger CounterGlobal; static NSInteger CounterStatic; { NSInteger localCounter = 42; __block char localCharacter; void (^aBlock)(void) = ^(void) { ++CounterGlobal; ++CounterStatic; CounterGlobal = localCounter; localCharacter = 'a'; }; ++localCounter; localCharacter = 'b'; aBlock(); }

优秀的个人博客,低调大师

《企业级ios应用开发实战》一3.6 可变参数

3.6 可变参数 我们知道,C和C++语言支持可变参数的函数,例如我们常用的NSLog和printf函数。Objective-C作为C语言的超集,当然毫无例外地也支持可变参数。迄今为止,我们至少用过了一种使用可变参数的方法,即NSString的stringWithFormat:方法。C语言通过stdarg.h库支持可变参数,Objective-C 也不例外。在C语言中,如果你要使用可变参数,必须包含头文件stdarg.h,但在Cocoa中却不必,因为苹果已经在 NSObjC Runtime.h中包含了stdarg.h。stdarg.h的定义如下: typedef __void va_list; #define va_start(ap, param) __builtin_va_start(ap, param) #define va_end(ap) __builtin_va_end(ap) #define va_arg(ap, type) __builtin_va_arg(ap, type) 首先定义了一个va_list类型,其实就是一个void,即可以指向任何类型的指针。你可以把它看成是char,因为char*实际上也可以指向任何内存单元的地址。然后是3个预定义宏,va_start、va_end和va_arg。可以看出stdarg.h完全是以“预定义宏”这种“古老”的方式来支持可变参数的。接下来我们看一个例子,该方法使用了一个可变参数,并将这些可变参数进行了累加,然后返回一个NSNumber: - (NSNumber ) addValues:(int) count, ... { va_list args; va_start(args, count); NSNumber value; double retval; for( int i = 0; i < count; i++ ) { value = va_arg(args, NSNumber ); retval += [value doubleValue]; } va_end(args); return [NSNumber numberWithDouble:retval]; } 代码说明:第1行是方法定义,该定义应当加到头文件中。省略号...表明方法接收一系列数目不定的参数,在...前面至少需要指定一个任意类型的参数。有时我们必须知道参数的个数以防止出现无效的引用,但在某种情况下,参数个数是可以通过其他参数推断出来的(例如NSLog或printf函数可以通过计算%号的个数推断可变参数的个数),或者对于NSMutableArray来说,它总是以nil终止。如果是最后一种方法,我们可以把方法重新定义为: - (NSNumber ) addValues:(NSNumber ) firstNumber, ... 这样,我们就可以用以下调用方式代替“addValues:3,num1,num2,num3”: addValues:num1,num2,num3; 这样,我们就可以省略第1个表示可变参数个数的int参数。第2行中的va_list是void *类型,因此它实际上是一个可变的对象数组。第3行用args来存放可变参数列表,而count则表示函数最后一个参数(即第一个“固定参数”)。这将使编译器把args指向第1个参数后的位置(通过count地址加上count变量的长度)。很奇怪吗?可变参数中第1个参数的位址为什么是“count地址+count的长度”?因为对于大多数C编译器,函数栈中参数的存放顺序是从右到左的,也就是说先放入可变参数的最后一个参数,再放可变参数的倒数第2个参数……,然后放可变参数的第1个参数,最后是固定参数count。而与此同时,栈的方向是向下的,即先入栈的数据位于高地址,后入栈的数据则位于栈的起始地址。这样,实际上最后放入的固定参数count的地址变成了栈的起始地址。而紧随count之后的地址则是可变参数的第1个参数地址,即“count地址+count的长度”,因此编译器要能找到第1个可变参数的地址,只要知道1个参数:count就够了,由count取得函数栈的起始地址,加上sizeof(count),得到第1个可变参数的地址。va_start的第1个参数args是一个输出参数,经过va_start调用之后,args将等于arg_start计算出来的第1个可变参数的地址。第6行是一个for循环,因为我们无法通过 args 自身推断 args 的大小,因此必须显式地用count来指定args的大小。或者可以使用nil终止的列表来检索可变参数。如果你使用nil终止的数组作为可变参数,则应该用下面一行来代替第6~7行: while( value = va_arg( args, NSNumber ) ) 第 7 行将 args 中的下一个参数放入 value,并显式地转为 NSNumber*(如果不知道类型,可以用id)。第10行表明,一旦使用完args列表,就关闭它 。提示:如果你使用va_arg(args,double)(或者float等其他原始类型),那么当你试图传递一系列整数作为参数时(例如:addValues:4,4,3,2,1),可能会出现一些古怪的结果。而如果你显式地将这些参数说明为double(例如,double num1,double num2,double num3,double num4)则不会有什么问题。这是因为,如果编译器看到一个方法有一个double参数但你却传递了一个整数给这个方法时,它会进行类型转换。但如果方法使用了可变参数,编译器无法知道参数所使用的类型,因此编译器只会简单地把参数作为整型处理。

优秀的个人博客,低调大师

《企业级ios应用开发实战》一3.7 本章小结

3.7 本章小结 Objective-C是C语言的扩展和超集。本章重点从C语言特性和面向对象特性两个方面对Objective-C的语言特性进行论述,包括基本语法(数据类型、常量/变量、分支与循环)、运行时特性(反射支持)和一些特有属性(NS类、类别和协议、消息、KVO和块)。通过这些介绍,我们对Objective-C的一些重要特性有了最基本的了解,从而为后续的学习打下坚实的基础。接下来,本书将陆续介绍iOS SDK中的一些重要框架,如UIKit、Core Animation、Quartz Core,以及其他一些第三方的开源框架。

优秀的个人博客,低调大师

《Storm企业级应用:实战、运维和调优》——导读

**前言**大数据是继云计算、物联网之后IT行业又一大颠覆性的技术变革。之前大数据在互联网、军事、金融、通信和物理学等领域已有不少落地案例,却因为近年来Hadoop技术的快速发展而引起业界广泛关注。可以说,Hadoop目前是大数据处理的关键技术,也是迄今为止,最成熟、应用最广泛的技术。但是Hadoop生态圈下面的数据处理几乎都是在离线状态下进行的,离线处理海量数据是比较耗时、耗力的,Storm的实时处理技术应运而生。正如曾经开发Storm的一位主要工程师所谈到的,Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm用于实时处理,就好比Hadoop用于批处理。Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息,更棒的是可以使用任意编程语言来开发。因此在节省时间、人力的

优秀的个人博客,低调大师

lamp-cloud 5.6.2 发布,安全加固、模块优化、UI 体验提升

升级日志 依赖版本跃升 升级 Spring Boot 至 3.5.7 升级 Spring Cloud Alibaba 至 2025.0.0.0 安全漏洞修复 升级 org.eclipse.jgit,解决 CVE-2025-4949 升级 commons-lang3,修复 CVE-2025-48924 升级 commons-fileupload,堵住 CVE-2023-24998/2025-48976/2024-47554 漏洞 架构优化 新增独立模块lamp-common-config,统一管理全局配置类与文件 为 spring-boot-actuator 端点添加访问限制,消除安全隐患 前端体验增强(lamp-web-max-vben) 优化左侧和右侧认证面板动画效果 优化Checkbox组件hover样式,Input组件placeholder样式,TabsList组件圆角样式 实现锁屏 / 解锁密码框自动聚焦,提升认证面板动画流畅度 修复对话框modal组件方法名错误 优化侧边栏展开折叠图标 体验网址 vben2 版 vben5 版 数据源模式 点我体验 点我体验 字段模式 点我体验 点我体验 推广 我正在参加 Gitee 2025 最受欢迎的开源软件投票活动,快来给我投票吧!https://gitee.com/activity/2025opensource?ident=IDPOGG 关于 lamp 灯灯(简称灯,英文名:lamp),她是一个项目集,为满足高内聚低耦合设计原则,将一个大项目拆解为以下几个子项目: lamp-util:后端工具集 lamp-cloud:基于 Spring Cloud 实现的后台 lamp-boot:基于 Spring Boot 实现的后台 lamp-job:基于 xxl-job 集成本项目的分布式定时任务 lamp-generator:代码生成器 lamp-web:前端 lamp-cloud简介 lamp-cloud是基于SpringCloudAlibaba、SpringCloud、SpringBoot开发的微服务中后台快速开发平台,支持jdk17、jdk11和jdk8,专注于多租户 (SaaS 架构) 解决方案,亦可作为普通项目(非 SaaS 架构)的基础开发框架使用,目前已实现数据库隔离、字段隔离等租户隔离方案以及非租户隔离的解决方案。 她拥有自研 RBAC(基于租户应用的角色权限控制体系)、网关统一鉴权、数据权限、优雅缓存解决方案、防缓存击穿、前后端统一表单校验、字典数据自动回显、可视化前后端代码生成器、支持多种文件存储、支持多种短信邮件发送接口、灰度发布、防 XSS 攻击、防 SQL 注入、分布式事务、分布式定时任务等功能;支持多业务系统并行开发,支持多服务并行开发,是中后台系统开发脚手架的最佳选择。 lamp-cloud 代码简洁,注释齐全,架构清晰,非常适合个人学习以及中小企业作为基础框架使用。采用 Spring Cloud Alibaba、SpringBoot、Mybatis、Seata、Sentinel、RabbitMQ、FastDFS/MinIO、SkyWalking 等主要框架和中间件。本项目旨在实现基础框架能力,不涉及具体业务。 关注项目 官网:https://tangyh.top 源码:https://github.com/dromara/lamp-cloud 源码:https://gitee.com/dromara/lamp-cloud

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册