load方法和initialize方法的理解

load 和 initialize 两个方法算是两个特殊的类方法了,今天偶然从草稿箱中看到还有本篇未完成的博文,如果说当初了解它们是为了应付面试,那么工作之后,了解它们就变成了“必修课”,相比于网上某些十分官方的说法,个人还是喜欢用大白话来诠释自己对它们的理解,这里就写一下个人对这两个方法的理解,如果有理解不到位的地方,还请指正,3Q

load方法

个人理解

从方法的名字来看,它应该是在一个类进行装载的时候触发,更果断一点的说法就是不管这个类有没有被调用,只要它被装载,那么它就会运行这个方法。
那么它什么时候才会被装载呢?而这个时间点应该就是这个类文件在被第一次编译的时候.
个人理解的编译其实就是由编译器静态的分析语法等是否符合标准的过程并将符合标准的语法翻译成机器语言(这也就是我们当语法不对的时候会出现报错,这个阶段是静态的,如果这里有些值是需要动态确定的,强烈建议请换个地方初始化吧)

示例

如果还是比较抽象,这里就用代码创建几个类来说明一下,以下创建一个叫做Person的类作为基类,在创建一个Student类继承自Person类,同时写一个Student的类别,并分别实现它们的load方法:

//Person.m
+(void)load { NSLog(@"I am Person..Load Function!"); }

//Student.m 继承自Person
+(void)load { NSLog(@"I am Student..Load Function!"); }

//Student+CustomLoad.m
+(void)load { NSLog(@"I am Student..Load Function!"); }

此时我们在main.m文件不做任何的操作,编译通过后运行,打印结果如下:

2016-08-30 14:36:59.037 Load_Initalization_Test[25633:319076] I am Person..Load Function!
2016-08-30 14:36:59.038 Load_Initalization_Test[25633:319076] I am Student..Load Function!
2016-08-30 14:36:59.038 Load_Initalization_Test[25633:319076] I am Student+CustomLoad..Load Function!
Program ended with exit code: 0


尽管我没有调用它们,但是它们load方法执行了,这就应了之前说的话,不管类有没有被调用,只要编译到就会执行load方法。
那么我们怎么知道文件会不会编译呢,其实在创建这个类的时候,Xcode自动已经帮我们把它添加到了Compile Sources里面(这里面的实现文件会在编译器编译阶段进行加载,也就是我们所说的load),具体位置就在Targets->Build Phases->Compile Source里面。

如下图(当然,如果把Student+CustomLoad.m从里面删掉,那么就不会打印Student+CustomLoad..Load Function!这句了;但如果您想把Person.m去掉,那么编译器是不会让你通过,因为Student的load依赖于父类Person)


执行顺序

那么顺序为什么load方法会是Person优先,其次是Student,最后才是Student+CustomLoad呢,load的开发文档中有这么两

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常抱歉,之前的回答有误。在 WinForms 应用程序中,UDP 数据的接收并不需要单独的线程。UDP 是一种无连接的协议,当数据到达时可以直接通过 UdpClient.Receive 方法进行接收,而不会阻塞 UI 线程。 在 WinForms 应用程序中,可以通过在 UI 线程中调用 UdpClient.Receive 方法来接收 UDP 数据。这是因为 UdpClient.Receive 方法是一个阻塞式方法,它会等待数据到达后再返回,并不会阻塞整个应用程序。 以下是一个简单的示例代码,展示了如何在 WinForms 应用程序中接收 UDP 数据: ```csharp using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Windows.Forms; namespace UDPExample { public partial class MainForm : Form { private UdpClient udpClient; public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { // 初始化 UDP 客户端 udpClient = new UdpClient(1234); // 开始异步接收 UDP 数据 udpClient.BeginReceive(ReceiveCallback, null); } private void ReceiveCallback(IAsyncResult ar) { try { IPEndPoint remoteEP = null; byte[] data = udpClient.EndReceive(ar, ref remoteEP); // 在 UI 线程上更新界面 Invoke((Action)(() => { string message = Encoding.UTF8.GetString(data); listBox1.Items.Add($"Received: {message} from {remoteEP}"); })); // 继续异步接收 UDP 数据 udpClient.BeginReceive(ReceiveCallback, null); } catch (Exception ex) { MessageBox.Show($"Error: {ex.Message}"); } } private void btnSend_Click(object sender, EventArgs e) { string message = txtMessage.Text; byte[] data = Encoding.UTF8.GetBytes(message); // 发送 UDP 数据 udpClient.Send(data, data.Length, "127.0.0.1", 1234); listBox1.Items.Add($"Sent: {message}"); txtMessage.Clear(); } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { // 关闭 UDP 客户端 udpClient.Close(); } } } ``` 在这个示例中,初始化了一个 UDP 客户端,并使用 `udpClient.BeginReceive` 方法开始异步接收 UDP 数据。当数据到达时,会调用 `ReceiveCallback` 方法进行处理。在 `ReceiveCallback` 方法中,通过 `udpClient.EndReceive` 方法获取接收到的数据,并在 UI 线程上更新界面。之后,再次调用 `udpClient.BeginReceive` 方法继续异步接收 UDP 数据。 需要注意的是,在接收到 UDP 数据后,使用 `Invoke` 方法在 UI 线程上更新界面,以确保线程安全性。 希望这个示例能够帮助你理解在 WinForms 应用程序中如何接收 UDP 数据,并不需要单独的线程来执行 `UdpClient.Receive` 方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值