当前位置: 首页 > news >正文

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

  1. 如何使用Podfile

相关文章:

iOS练手项目知识点汇总

基础理解篇 Objective-C是一种面向对象的编程语言&#xff0c;它支持元编程。元编程是指编写程序来生成或操纵其他程序的技术。 Objective-C中&#xff0c;元编程可以使用Objective-C的动态特性来实现。例如可以使用Objective-C的运行时函数来动态地创建类、添加属性和方法等等…...

【Linux】Libevent相关小知识总结

Libevent是基于事件的&#xff0c;也就是说&#xff0c;相当于去注册一个事件&#xff0c;当这个事件发生的话&#xff0c;那么就会调用回调函数。...

【Spring Security】UserDetailsService 接口介绍

文章目录 UserDetailsService 介绍UserDetailsService 具体操作UserDetailsService 方法介绍 UserDetailsService 介绍 UserDetailsService 在 Spring Security 中主要承担查询系统内用户、验证密码、封装用户信息和角色权限。大白话就是你写一个实现类实现 UserDetailsServic…...

Mybatis学习|日志工厂、分页

1.日志工厂 如果一个数据库操作&#xff0c;出现了异常&#xff0c;我们需要排错。日志就是最好的助手! 曾经: sout、debug 现在:日志工厂! 我们主要掌握STDOUT_LOGGING 和LOG4j 在Mybatis中具体使用哪个一日志实现&#xff0c;在设置中设定! 在mybatis核心配置文件中&#…...

Vivado 添加FPGA开发板的Boards file的添加

1 digilent board file 下载地址 下载地址 &#xff1a; https://github.com/Digilent/vivado-boards 2 下载后 3 添加文件到 vivado 安装路径 把文件复制到 Vivado\2019.1\data\boards\board_files4 创建工程查看是否安装成功...

vmstat

vmstat VirtualMeomoryStatistics&#xff0c;虚拟内存统计&#xff0c;是Linux中监控内存的常用工具&#xff0c;可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。 [rootwenzi wenzi]# vmstat procs -----------memory---------- ---swap-- -----io---- -system--…...

LinuxShell变量

变量&#xff1a; 命名规则&#xff1a; 在Shell中&#xff0c;变量名可以由字母、数字或者下划线组成&#xff0c;并且只能以字母或者下划线开头。对于变量名的长度&#xff0c;Shell并没有做出明确的规定。因此&#xff0c;用户可以使用任意长度的字符串来作为变量名。但是…...

如何实现的手机实景自动直播,都有哪些功能呢?

手机实景自动直播最近真的太火了&#xff0c;全程只需要一部手机&#xff0c;就能完成24小时直播带货&#xff0c;不需要真人出镜&#xff0c;不需要场地&#xff0c;不需要搭建直播间&#xff0c;只需要一部手机就可以了。真人语音讲解&#xff0c;真人智能回复&#xff0c;实…...

如何让qt tableView每个item中个别字用不同颜色显示?

如何让qt tableView每个item中个别字用不同颜色显示&#xff1f; 从上面图片可以看到&#xff0c;Item为红色&#xff0c;数字5为黑色。 要实现在一个控件实现不同颜色&#xff0c;目前想到的只有QTextEdit 、QLabel。有两种方法&#xff0c;第一种是代理&#xff0c;第二种是…...

Aspose导出word使用记录

背景&#xff1a;Aspose系列的控件&#xff0c;功能实现都比较强大&#xff0c;可以实现多样化的报表设计及输出。 通过这次业务机会&#xff0c;锂宝碳审核中业务功需要实现Word文档表格的动态导出功能&#xff0c;因此学习了相关内容&#xff0c;在学习和参考了官方API文档的…...

[Java]_[初级]_[使用SAX流的方式写入XML文件]

场景 文件的写入目前没有发现可以增量写入的&#xff0c;只能是完全重新写入。对于大量数据需要写入XML文件&#xff0c;还是和读XML文件一样&#xff0c;不需要生成DOM模型能节省不少的内存和指令。 说明 在java标准库里&#xff0c;也是有相关的SAX类来写入数据流&#xf…...

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中如何进行页面跳转&#xff1f; 答案&#xff1a;可以使用uni.navigateTo、uni.redirectTo和uni.reLaunch等方法进行页面跳转。其中&#xff0c;uni.navigateTo可以实现页面的普通跳转&#xff0c;uni.redirectTo可以实现页面的重定向跳转&#xff0c;uni.reLaunch可以实…...

Java“牵手”1688整店商品API接口数据,通过店铺ID获取整店商品详情数据,1688店铺所有商品API申请指南

1688平台店铺所有商品数据接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688整店的商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、价格信息等详细信息 。 获取店铺所有商品接口API是一种用于获取电商平台上商品详…...

数据进制的转换

其他进制转换为十进制 通过按权展开法转换 十进制转换为其他进制 通过短除法转换&#xff08;注意计算结果是倒着的&#xff09; 例如将十进制的94转换为二进制 二进制转八进制和十六进制 3位二进制数表示1位八进制数&#xff0c;4位二进制数表示1位十六进制数 同理八进制数…...

如何分析识别文章/内容中高频词和关键词?

theme: orange 要分析一篇文章的高频词和关键词&#xff0c;可以使用 Python 中的 nltk 库和 collections 库或者jieba库来实现&#xff0c;本篇文章介绍基于两种库分别实现分析内容中的高频词和关键词。 nltk 和 collections 库 首先&#xff0c;需要安装 nltk 库和 collectio…...

Windows7安装SSH客户端的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

力扣:81. 搜索旋转排序数组 II(Python3)

题目&#xff1a; 已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数组变为 [nums[k], nums[k1], .…...

TCP IP网络编程(三) 地址族与数据序列

文章目录 分配给套接字的IP地址与端口号网络地址网络地址分类与主机地址边界 地址信息的表示表示 IPv4地址的结构体结构体sockaddr_in 的成员分析 网络字节序与地址变换字节序与网络字节序字节序转换 网络地址的初始化与分配将字符串信息转换为网络字节序的整数型网络地址初始化…...

对比Flink、Storm、Spark Streaming 的反压机制

分析&回答 Flink 反压机制 Flink 如何处理反压? Storm 反压机制 Storm反压机制 Storm 在每一个 Bolt 都会有一个监测反压的线程&#xff08;Backpressure Thread&#xff09;&#xff0c;这个线程一但检测到 Bolt 里的接收队列&#xff08;recv queue&#xff09;出现了…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

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 提…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...