iOS练手项目知识点汇总
基础理解篇
Objective-C是一种面向对象的编程语言,它支持元编程。元编程是指编写程序来生成或操纵其他程序的技术。
Objective-C中,元编程可以使用Objective-C的动态特性来实现。例如可以使用Objective-C的运行时函数来动态地创建类、添加属性和方法等等。
#import <Foundation/Foundation.h>@interface MyClass : NSObject
@property (nonatomic, strong) NSString *name;
- (void)printName;
@end@implementation MyClass
- (void)printName {NSLog(@"%@", self.name);
}
@endint main(int argc, const char * argv[]) {@autoreleasepool {MyClass *myObj = [[MyClass alloc] init];[myObj printName];// 动态添加属性和方法[[myObj class] addMethod:@selector(sayHello:) withSignature:@"v"];[[myObj class] addProperty:@"age" withType:@integerValue withAttribute:NONE];// 动态调用方法((void (*)(id, SEL))[[myObj class] performSelector:@selector(sayHello:) withObject:nil]))(myObj, @selector(sayHello:));// 动态添加属性((void (*)(id, SEL, id))[[myObj class] performSelector:@selector(setProperty:forKey:) withObject:[NSNumber numberWithInt:100] forKey:@"age"])(myObj, @selector(setProperty:forKey:), @100);// 动态删除属性和方法[[myObj class] removeMethod:@selector(sayHello:)];[[myObj class] removeProperty:@"age"];}return 0;
}
Objective-C是一种动态编程语言,它将静态语言在编译和链接时需要做的一些事情给延后到运行时执行。例如方法的调用,只有在程序执行的时候,才能具体定位到哪个类的哪个方法。这就需要一个运行时库,就是Runtime。
Runtime机制是指Objective-C运行时系统,它提供了一些类和方法来帮助我们动态地创建、修改和访问对象。其中最重要的是objc_msgSend函数,它可以用来发送消息并调用对象的方法。除此之外,还有很多其他的类和方法可以用来实现动态行为,比如class_addMethod、method_exchangeImplementations等等。
推荐阅读:什么是元编程(meta-promgramming)?
工程知识篇
1.Xcode创建工程
Xcode创建工程:iOS–>App–>填写工程名选择语言(OC\Swift)–>选择存放路径(一般放在User目录下,访达–>前往–>个人可以打开用户个人文件夹 。理由忘了,欢迎评论区大佬解答)
2.创建工程后AppDelegate 和 ViewController的说明
AppDelegate是应用程序委托对象,其父类是UIResponder类(继承关系),并实现UIApplicationDelegate委托协议.
[UIResponder:实现应用程序的处理响应事件的能力]
[UIApplicationDelegate委托协议使AppDelegate成为应用程序的委托对象,这种对象能够响应应用程序的生命周期]
(生命周期在程序运行的不同阶段进行回调)
//AppDelegate.h#import <UIKit/UIKit.h>@interface AppDelegate: UIResponder <UIApplicationDelegate>@property (strong,nonatomic) UIWindow* window; //ios程序视图中只有一个UIWindow@end//AppDelegate.m#import "AppDelegate.h"@interface AppDelegate()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLauchingWithOptions:(NSDictionary *)launchOptions{return YES;}
//应用启动并进行初始化时会调用该方法并发出通知UIApplicationDidFinishLauchingNotification.这个阶段会实例化根视图控制器- (void)applicationWillResignActive:(UIApplication *)application{}
//应用从活动状态进入非活动状态时调用该方法并发出通知UIApplicationWillResignActiveNotification- (void)applicationDidEnterBackground:(UIApplication *)application{}
//应用进入后台时候调用该方法并发出通知UIApplicationDidEnterBackgroundNotification- (void)applicationWillEnterForeground:(UIApplication *)application{}
//应用进入前台时候但未处于活跃状态时候调用该方法并发出通知UIApplicationWillEnterForegroundNotification- (void)applicationDidBecomeActive:(UIApplication *)application{}- (void)applicationWillTerminate:(UIApplication *)application{}
//应用被终止时候调用该方法并发出通知UIApplicationWillTerminateNotification,但内存清除时除外@end作者:星辰_入海
链接:https://www.jianshu.com/p/859d11e1e2fd
关于ViewController更详细的说明可参考:viewController详解
文章备用链接:https://www.pianshen.com/article/13491799244/#google_vignette
重点摘录如下:(流程图有些没仔细描述、推荐看原文)
1. view的生命周期

当一个视图控制器被创建,并在屏幕上显示的时候。 代码的执行顺序
1、 alloc 创建对象,分配空间
2、init (initWithNibName) 初始化对象,初始化数据
3、loadView 从nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图
4、viewDidLoad 载入完成,可以进行自定义数据以及动态创建其他控件
5、viewWillAppear 视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
6、viewDidAppear 视图已在屏幕上渲染完成
当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
1、viewWillDisappear 视图将被从屏幕上移除之前执行
2、viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个视图了
3、dealloc 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
关于viewDidUnload :在发生内存警告的时候如果本视图不是当前屏幕上正在显示的视图的话, viewDidUnload将会被执行,本视图的所有子视图将被销毁,以释放内存,此时开发者需要手动对viewLoad、viewDidLoad中创建 的对象释放内存。 因为当这个视图再次显示在屏幕上的时候,viewLoad、viewDidLoad 再次被调用,以便再次构造视图。
2. view的加载过程

3. view卸载过程图

推荐看:ViewController生命周期实例
3. 应用程序状态以及不同场景下的变化
应用程序可能所处的状态:

不同场景下状态的变化:
应用启动场景
描述:当用户第一次启动程序时候,或者终止后再次启动
(1)Not running --> Inactive
(2)Inactive --> Active

应用退出场景
描述:分为两种可能:1.可以在后台运行或者挂起;2.不可以在后台运行和挂起
Step1:
(1)Active --> Inactive
(2)Inactive --> Background
(3)Background --> Suspended

Step2:
(1)Active --> Inactive
(2)Inactive --> Background
(3)Background --> Suspended
(4)Suspended --> Not running

应用挂起重新运行场景
(1)Suspended --> Background
(2)Background --> Inactive
(3)Inactive --> Active
应用终止状态
内存清除后应用程序终止,可能是强制清除内存,还可以是使用者手动清除
Background --> Suspended --> Not running
作者:星辰_入海
链接:https://www.jianshu.com/p/859d11e1e2fd
4.IOS开发多线程
参考资料:IOS开发多线程讲解(一)–结合斯坦福ios7开发(十)
爬过的坑:
5.UITableviewCell复用机制
参考资料:UITableviewCell复用机制
爬过的坑
6.类方法和实例方法调用
7. 属性strong和copy的区别
8.小概念:nib segue kvc kvo
nib:NIB是Non-interactive Interface Builder的缩写,是一种可视化的界面设计工具。它可以让你通过拖拽控件来设计界面,而无需编写代码。NIB文件通常包含多个窗口、视图和控制器等元素,这些元素可以相互连接并设置属性。
segue:
KVC是Key-Value Coding的缩写,即键值编码。它是一种动态获取对象属性值的方法。KVC可以通过字符串来访问对象的属性,例如:object.valueForKey(“name”)。
KVO是Key-Value Observing的缩写,即键值观察。它是一种动态监听对象属性变化的方法。KVO可以通过添加观察者来实现,当被观察对象的属性发生变化时,观察者会收到通知并作出相应处理。
下面是一个使用KVC和KVO的代码实例:
// 创建一个Person类
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@end@implementation Person
@end// 创建一个Person对象并设置name属性
Person *person = [[Person alloc] init];
person.name = @"Tom";// 使用KVC获取name属性值
NSString *name = [person valueForKey:@"name"];
NSLog(@"name is %@", name);// 使用KVO监听name属性变化
[[person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]];// 修改name属性值
person.name = @"Jerry";// 手动发送name属性变化的通知
[[person didChangeValueForKeyPath:@"name" notification:nil];
9. weak strong 循环引用
什么是循环引用:
循环引用是指两个对象相互强引用了对方,即retain了对方,从而导致两个对象都无法被释放,引发了内存泄漏现象。
在Objective-C中,循环引用通常发生在两个对象之间,其中一个对象持有另一个对象的强引用,而另一个对象也持有第一个对象的强引用。这种情况下,即使第一个对象被释放了,第二个对象也不会被释放,因为它们之间存在循环引用。这种情况可能会导致内存泄漏和其他问题。
循环引用实例:
@interface Person : NSObject
@property (nonatomic, strong) Person *friend;
@end@implementation Person
@synthesize friend = _friend;
@endPerson *person1 = [[Person alloc] init];
Person *person2 = [[Person alloc] init];// person1持有了person2的强引用,而person2也持有了person1的强引用
person1.friend = person2;
person2.friend = person1;[person1 release]; // 释放person1对象
在这个例子中,Person类有一个属性friend,它是一个指向其他Person对象的指针。当创建两个Person对象时,它们相互持有对方的强引用,形成了循环引用。当其中一个对象被释放时,由于它持有另一个对象的强引用,所以另一个对象也无法被释放,从而引发了内存泄漏问题。
为了避免造成循环引用,代理一般需使用弱引用
例子:
#import <UIKit/UIKit.h>//新建一个协议,协议的名称一般是由:"类名+Delegate"@protocol ViewControllerBDelegate<NSObject>//代理方必须实现的方法
@required//代理方可选实现的方法
@optional
- (void)ViewControllerBsendValue:(NSString *)value;
@end@interface ViewControllerB : UIViewController//委托代理人,为了避免造成循环引用,代理一般需使用弱引用
@property(weak,nonatomic) id<ViewControllerBDelegate> delegate;
//id是一个通用的数据类型,表示任何对象。在这个例子中,id<ViewControllerBDelegate>表示一个遵循ViewControllerBDelegate协议的对象的通用指针。
//这行代码定义了一个名为delegate的属性,其类型为ViewControllerBDelegate的弱引用。这意味着这个属性可以指向任何遵循ViewControllerBDelegate协议的对象,但是这个对象并不会增加delegate的引用计数。因此,当delegate所指向的对象被释放时,它不会影响ViewControllerB对象的内存管理。
@end
代码实战篇
2.
//
// AppDelegate.m
// ExampleCode
//
//#import "AppDelegate.h"
#import "ViewController.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// 第一个页面ViewController *viewController = [[ViewController alloc] init];//UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];// 初始化并显示第一个页面self.window = [[UIWindow alloc] init];self.window.backgroundColor = [UIColor whiteColor];self.window.frame = [[UIScreen mainScreen] bounds];//获取手机宽高
// CGSize size_screen = self.window.frame.size;
// CGFloat scale_screen = [UIScreen mainScreen].scale; //屏幕缩放比
// NSLog(@"the width of screen is:%f",size_screen.width*scale_screen); //1170 像素分辨率(px)
// NSLog(@"the height of screen is:%f",size_screen.height*scale_screen); //2532
// NSLog(@"the width of screen is:%f",size_screen.width); //390
// NSLog(@"the height of screen is:%f",size_screen.height); //844self.window.rootViewController = viewController;[self.window makeKeyAndVisible];return YES;
}@end
工具篇
2.
小tips
- 如何使用Podfile
相关文章:
iOS练手项目知识点汇总
基础理解篇 Objective-C是一种面向对象的编程语言,它支持元编程。元编程是指编写程序来生成或操纵其他程序的技术。 Objective-C中,元编程可以使用Objective-C的动态特性来实现。例如可以使用Objective-C的运行时函数来动态地创建类、添加属性和方法等等…...
【Linux】Libevent相关小知识总结
Libevent是基于事件的,也就是说,相当于去注册一个事件,当这个事件发生的话,那么就会调用回调函数。...
【Spring Security】UserDetailsService 接口介绍
文章目录 UserDetailsService 介绍UserDetailsService 具体操作UserDetailsService 方法介绍 UserDetailsService 介绍 UserDetailsService 在 Spring Security 中主要承担查询系统内用户、验证密码、封装用户信息和角色权限。大白话就是你写一个实现类实现 UserDetailsServic…...
Mybatis学习|日志工厂、分页
1.日志工厂 如果一个数据库操作,出现了异常,我们需要排错。日志就是最好的助手! 曾经: sout、debug 现在:日志工厂! 我们主要掌握STDOUT_LOGGING 和LOG4j 在Mybatis中具体使用哪个一日志实现,在设置中设定! 在mybatis核心配置文件中&#…...
Vivado 添加FPGA开发板的Boards file的添加
1 digilent board file 下载地址 下载地址 : https://github.com/Digilent/vivado-boards 2 下载后 3 添加文件到 vivado 安装路径 把文件复制到 Vivado\2019.1\data\boards\board_files4 创建工程查看是否安装成功...
vmstat
vmstat VirtualMeomoryStatistics,虚拟内存统计,是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。 [rootwenzi wenzi]# vmstat procs -----------memory---------- ---swap-- -----io---- -system--…...
LinuxShell变量
变量: 命名规则: 在Shell中,变量名可以由字母、数字或者下划线组成,并且只能以字母或者下划线开头。对于变量名的长度,Shell并没有做出明确的规定。因此,用户可以使用任意长度的字符串来作为变量名。但是…...
如何实现的手机实景自动直播,都有哪些功能呢?
手机实景自动直播最近真的太火了,全程只需要一部手机,就能完成24小时直播带货,不需要真人出镜,不需要场地,不需要搭建直播间,只需要一部手机就可以了。真人语音讲解,真人智能回复,实…...
如何让qt tableView每个item中个别字用不同颜色显示?
如何让qt tableView每个item中个别字用不同颜色显示? 从上面图片可以看到,Item为红色,数字5为黑色。 要实现在一个控件实现不同颜色,目前想到的只有QTextEdit 、QLabel。有两种方法,第一种是代理,第二种是…...
Aspose导出word使用记录
背景:Aspose系列的控件,功能实现都比较强大,可以实现多样化的报表设计及输出。 通过这次业务机会,锂宝碳审核中业务功需要实现Word文档表格的动态导出功能,因此学习了相关内容,在学习和参考了官方API文档的…...
[Java]_[初级]_[使用SAX流的方式写入XML文件]
场景 文件的写入目前没有发现可以增量写入的,只能是完全重新写入。对于大量数据需要写入XML文件,还是和读XML文件一样,不需要生成DOM模型能节省不少的内存和指令。 说明 在java标准库里,也是有相关的SAX类来写入数据流…...
java里面封装https请求工具类
1.工具类如下 Component Slf4j public class RestClientUtil<T> {private final RestTemplate restTemplate;public RestClientUtil() {this.restTemplate new RestTemplate();}public JSONObject uploadFile(String url, String fileUrl) throws IOException {List<…...
uniApp常见面试题-附详细答案
uniApp中如何进行页面跳转? 答案:可以使用uni.navigateTo、uni.redirectTo和uni.reLaunch等方法进行页面跳转。其中,uni.navigateTo可以实现页面的普通跳转,uni.redirectTo可以实现页面的重定向跳转,uni.reLaunch可以实…...
Java“牵手”1688整店商品API接口数据,通过店铺ID获取整店商品详情数据,1688店铺所有商品API申请指南
1688平台店铺所有商品数据接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取1688整店的商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、价格信息等详细信息 。 获取店铺所有商品接口API是一种用于获取电商平台上商品详…...
数据进制的转换
其他进制转换为十进制 通过按权展开法转换 十进制转换为其他进制 通过短除法转换(注意计算结果是倒着的) 例如将十进制的94转换为二进制 二进制转八进制和十六进制 3位二进制数表示1位八进制数,4位二进制数表示1位十六进制数 同理八进制数…...
如何分析识别文章/内容中高频词和关键词?
theme: orange 要分析一篇文章的高频词和关键词,可以使用 Python 中的 nltk 库和 collections 库或者jieba库来实现,本篇文章介绍基于两种库分别实现分析内容中的高频词和关键词。 nltk 和 collections 库 首先,需要安装 nltk 库和 collectio…...
Windows7安装SSH客户端的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
力扣:81. 搜索旋转排序数组 II(Python3)
题目: 已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k1], .…...
TCP IP网络编程(三) 地址族与数据序列
文章目录 分配给套接字的IP地址与端口号网络地址网络地址分类与主机地址边界 地址信息的表示表示 IPv4地址的结构体结构体sockaddr_in 的成员分析 网络字节序与地址变换字节序与网络字节序字节序转换 网络地址的初始化与分配将字符串信息转换为网络字节序的整数型网络地址初始化…...
对比Flink、Storm、Spark Streaming 的反压机制
分析&回答 Flink 反压机制 Flink 如何处理反压? Storm 反压机制 Storm反压机制 Storm 在每一个 Bolt 都会有一个监测反压的线程(Backpressure Thread),这个线程一但检测到 Bolt 里的接收队列(recv queue)出现了…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
