iOS Dev (38) 你不一定看到懂了 main.m 文件

本文解析了iOS应用主入口main.m文件的工作原理,重点介绍了autoreleasepool的作用及UIApplicationMain函数的功能,包括创建UIApplication对象、委托对象及事件循环。

iOS Dev (38) 你不一定看到懂了 main.m 文件

先看看代码

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

int main(int argc, char * argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,
        NSStringFromClass([AppDelegate class]));
    }
}

它都做了什么?

有两个重点,一个是自动释放池 autorelease pool。这个东东是 iOS5 引入 Auto Reference Counting 后加入的东东。要注意的是,这个货意味着对应一个线程(在这里,就是主线程)。而对于一个多线程的 Application,你应该再为其他线程准备 autorelease pool。

另一个重点,就是 UIApplicationMain。这东东最基本的功能,自然是创建一个 Application 对象。其次呢,它还会创建相应的委托对象(Delegate),Application 在应用出现相应状态变化时调用相应的协议方法。这货负责建立应用程序的事件循环(Event Loop),事件循环中可以不断接收交互操作,比如屏幕触摸手势、各类传感器(重力加速器、陀螺仪等)等。

为什么没看到 UIApplication 这货的实例?

我们知道,一个可以拿出来得瑟的应用,至少要有一个 UIApplication 作为主体,接收各类 events。而还要有一个 UIApplicationDelegate 来作为具体处理 events 的家伙。简单说,前者接收事件,后者处理事件。

接收事件这部分的代码,iOS 都帮你写好了,你只需要把如何处理事件的代码写出来就行了。UIApplicationMain 会自动创建 UIApplication,吼吼,这就是所谓“帮你写好了”。里面到底咋回事,你不用管。

你要做的,就是把 UIApplicationDelegate 搞定。工程创建好后,有一个 AppDelegate 这个货在那。这货的代码如下:

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end

意思是不是很清楚啊。那么你看看 AppDelegate.m 文件,就知道这货都是如何处理事件的了(事实上,并没有啥代码,代码都被封装在了 UIApplicationDelegate 里)。


转载请注明来自大锐哥的博客:http://blog.youkuaiyun.com/prevention

<think>我们被要求生成一个20MB的文本文件。由于文本文件的大小取决于其内容(字符数),而每个英文字符通常占用1字节(如果是ASCII编码),那么20MB就是20*1024*1024字节,即20,971,520个字符。我们可以通过编程生成一个包含大量字符的文本文件。这里提供几种方法:方法1:使用重复文本生成一个字符串,重复多次直到达到所需大小。例如,我们可以用一个字符串(比如"HelloWorld\n")重复若干次。但要注意换行符也占用空间(在Windows中,换行符是\r\n,占2字节;在Unix-like系统中是\n,占1字节)。为了跨平台,我们可以只使用一个字符(比如'a')重复,但这样生成的文件没有可读性。或者,我们可以生成有意义的文本,比如随机字母、数字等。方法2:生成随机文本我们可以生成随机字符来填充文件。考虑到20MB比较大,我们不能一次性生成一个20MB的字符串(可能占用大量内存),而是应该分块写入。这里我们使用分块写入的方法,每次写入一定大小的数据(比如1MB),循环20次。下面分别用几种编程语言来实现:1.Python实现2.C++实现3.C#实现由于用户没有指定语言,我们以Python为例,因为Python代码简洁。注意:我们生成的文件内容可以是任意字符,为了简单,我们使用字母和数字的随机组合,也可以使用重复的文本行。步骤:-打开一个文件(以写入模式,二进制模式可以确保精确控制大小,但文本模式也可以,因为我们要的是20MB,所以内容要精确)-循环写入,每次写入一个块(比如1MB的数据)-每个块由重复的字符串组成,或者随机生成但是,如果使用随机生成,要注意随机生成的速度可能较慢。我们可以预先生成一个小块(比如1KB),然后重复这个块多次来组成1MB,再重复20次。另一种方法是:生成一个固定字符串(比如1000个字符),然后重复这个字符串直到达到20MB。计算:20MB=20*1024*1024=20971520字节。我们计划:-定义每个块的大小为1024*1024字节(1MB)-总共20个块每个块的内容:我们可以用相同的模式填充,例如,生成一个长度为1024的字符串(1KB),然后重复1024次得到1MB。具体步骤(Python):1.定义总大小=20*1024*10242.定义块大小(例如1MB),但我们也可以用小块(如1KB)来构建3.生成一个包含1024个字符的字符串(例如,由字母和数字组成)4.打开文件,循环写入:将这个小块重复1024次得到1MB,然后循环20次。但是,为了避免内存占用过大,我们可以每次只写1MB,并且这1MB是由重复的小字符串组成的。代码示例(Python):```pythonimportosdefgenerate_large_file(filename,size_in_mb=20):#计算总字节数total_size=size_in_mb*1024*1024#定义小块大小(1KB)chunk_size=1024#每个小块的内容:这里用字母和数字随机生成,但为了可重复和简单,我们用固定的模式#生成一个由字母和数字组成的字符串,长度为chunk_size#为了简单,我们使用重复的字符模式,例如:一个包含64个字符的字符串重复16次(64*16=1024)base_str="0123456789ABCDEF"*64#64*16=1024,即1KB#计算每个块(1MB)需要重复多少次base_str(1024次?不对,因为base_str已经是1024字节了,所以重复1次就是1KB,重复1024次就是1MB)#但这里我们直接按1MB写入:重复1024次base_str(即1024KB=1MB)#计算需要写入多少次1MB块mb_blocks=size_in_mb#打开文件,以二进制写入模式(这样我们可以精确控制,且跨平台)withopen(filename,'wb')asf:foriinrange(mb_blocks):#每次写入1MBforjinrange(1024):#1024个1KB块,即1MBf.write(base_str.encode('utf-8'))#将字符串编码为字节写入#打印进度print(f"已写入{i+1}MB")#检查文件大小actual_size=os.path.getsize(filename)print(f"文件已生成,大小:{actual_size}字节,即{actual_size/(1024*1024):.2f}MB")#调用函数generate_large_file("20MB_file.txt",20)```注意:上面的base_str是1024个字节(如果使用英文字符,且编码为UTF-8,那么每个字符占1字节)。这样写入20MB。但是,如果我们需要生成可读的文本,比如每行有一定长度,并且有换行符,我们可以在base_str中加入换行符。例如,我们每80个字符加一个换行符,那么就需要调整base_str的结构。不过,题目没有要求可读性,所以我们用简单的重复字符串即可。另外,我们也可以使用随机字符串,但随机生成会慢一些。如果用户需要随机内容,我们可以修改base_str为随机生成,但注意每次生成1KB的随机字符串,然后重复使用这个字符串来构建整个文件(这样同一块内的内容重复,但不同块之间如果使用同一个字符串,那么整个文件都是重复的)。如果希望整个文件随机,那么我们需要每次生成不同的随机字符串,但这样会消耗更多CPU。这里我们选择重复的字符串,因为生成速度快。其他语言的方法类似。如果用户需要其他语言,我们可以提供:C++示例:```cpp#include<iostream>#include<fstream>#include<string>#include<cstdlib>intmain(){constintMB=1024*1024;constintsize_in_mb=20;constintblock_size=1024;//1KBblockstd::stringbase_str(1024,'A');//创建一个1024个'A'组成的字符串std::ofstreamoutfile("20MB_file.txt",std::ios::binary);if(!outfile){std::cerr<<"无法打开文件!"<<std::endl;return1;}for(inti=0;i<size_in_mb;++i){for(intj=0;j<1024;++j){//1024blocksof1KB=1MBoutfile.write(base_str.c_str(),block_size);}std::cout<<"已写入"<<i+1<<"MB"<<std::endl;}outfile.close();std::cout<<"文件生成完成!"<<std::endl;return0;}```C#示例:```csharpusingSystem;usingSystem.IO;usingSystem.Text;classProgram{staticvoidMain(){intsizeInMB=20;intblockSize=1024;//1KBblockstringbaseStr=newstring('A',blockSize);//1024个'A'using(FileStreamfs=File.OpenWrite("20MB_file.txt")){using(StreamWritersw=newStreamWriter(fs,Encoding.UTF8))//注意这里用StreamWriter会处理编码,但我们要精确控制字节,所以用FileStream直接写字节{//由于StreamWriter会进行编码,并且可能添加BOM,所以我们改用FileStream直接写入字节}}//改用FileStream直接写using(FileStreamfs=newFileStream("20MB_file.txt",FileMode.Create)){byte[]data=Encoding.UTF8.GetBytes(baseStr);//获取字节数组,长度为1024for(inti=0;i<sizeInMB;i++){for(intj=0;j<1024;j++)//1024次写入,每次1KB,共1MB{fs.Write(data,0,data.Length);}Console.WriteLine($"已写入{i+1}MB");}}Console.WriteLine("文件生成完成!");}}```注意:在C#中,如果使用StreamWriter写入字符串,它会在开头写入BOM(字节顺序标记),这会使文件开头多出几个字节,导致大小不精确。所以我们使用FileStream直接写入字节数组。总结:我们提供了三种语言的实现,用户可以根据需要选择。其中Python版本最为简洁。另外,如果用户需要生成有特定内容的文件(比如每行有行号、随机句子等),则需要调整生成内容的逻辑。但本题只要求大小,所以用重复字符即可。最后,生成的文件大小应该是精确的20MB(20*1024*1024字节)。相关问题:1.如何生成特定内容的超大文本文件(如日志文件)?2.生成文本文件时如何避免内存不足?3.除了编程方法,还有哪些工具可以生成大文件?4.如何验证生成的文件大小?5.在生成文件时如何加入随机数据?</think>### 生成20MB文本文件的编程方法 #### 方法1:Python实现(推荐) ```python def generate_large_file(filename, size_mb=20): chunk_size = 1024 * 1024 # 每次写入1MB total_size = size_mb * 1024 * 1024 base_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\n" with open(filename, 'w') as f: written = 0 while written < total_size: # 计算本次写入量(避免超过目标大小) write_size = min(chunk_size, total_size - written) # 重复基础文本直到填满chunk repeats = (write_size // len(base_text)) + 1 chunk = (base_text * repeats)[:write_size] f.write(chunk) written += write_size print(f"已生成: {written/(1024*1024):.2f}MB/{size_mb}MB") # 使用示例 generate_large_file("20MB_file.txt") ``` #### 方法2:C++实现 ```cpp #include <iostream> #include <fstream> #include <string> int main() { const int MB = 20; const long target_size = MB * 1024 * 1024; const std::string base_text = "Lorem ipsum dolor sit amet.\n"; std::ofstream outfile("20MB_file.txt", std::ios::binary); long written = 0; while (written < target_size) { long remaining = target_size - written; long write_size = (remaining > base_text.size()) ? base_text.size() : remaining; outfile.write(base_text.c_str(), write_size); written += write_size; std::cout << "已生成: " << written/(1024*1024) << "MB/" << MB << "MB\n"; } outfile.close(); return 0; } ``` #### 方法3:命令行快速生成(Windows/Linux) ```bash # Windows (使用fsutil) fsutil file createnew 20MB_file.txt $((20*1024*1024)) # Linux (使用dd) dd if=/dev/zero of=20MB_file.txt bs=1M count=20 ``` ### 关键说明 1. **内存管理**:使用分块写入技术避免内存溢出,每次只处理1MB数据[^4] 2. **内容生成**:重复模式文本提高效率(示例使用拉丁占位文本) 3. **精确控制**:计算字节级写入量确保精确达到20MB 4. **跨平台**:提供Python(推荐)、C++和命令行三种方案 > 生成20MB文件约需0.5秒(SSD硬盘),实际时间取决于系统性能。验证文件大小:`ls -lh 20MB_file.txt`(Linux)或文件属性查看(Windows)[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值