应用

  • 字典模型互相转换( json to model)
  • 实现多继承
  • 添加属性,关联对象
  • 澳门微尼斯人手机版,动态增加方法
  • isa swizzling
  • method swizzling
  • NSCoding自动归档、解档
  • 面向层面编程

NSURLSessionUploadTask———文件上传

// 设置请求头request.HTTPMethod = @"POST";[request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", XMGBoundary] forHTTPHeaderField:@"Content-Type"];// 设置请求体NSMutableData *body = [NSMutableData data];// 文件参数// 分割线[body appendData:XMGEncode];[body appendData:XMGEncode(XMGBoundary)];[body appendData:XMGNewLine];.....// 注意这里通过设置请求体 = data完成文件上传,官方说这样做会被忽略// 就是说, 如果利用NSURLSessionUploadTask上传文件, 那么请求体必须写在fromData参数中, 不能设置在request中. 否则设置在request中会被忽略/*The body stream and body data in this request object are ignored.*/// request.HTTPBody = data; ❌// 1.创建sessionNSURLSession *session = [NSURLSession sharedSession];// 2.根据session创建Task//注意这里的data是文件参数和非文件参数的拼接二进制❤️NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromData: body completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);}];// 3.执行Task[task resume];// 注意:不要使用这个方法. fromFile方法是用于PUT请求上传文件的// 而我们的服务器只支持POST请求上传文件 [session uploadTaskWithRequest:request fromFile:fileUrl completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {}];❌

</pre>

参考

Runtime一小时入门

如何正确使用Runtime

三:NSURLSessionDataTask 简单下载
//最简单的下载 1. URL NSString *urlString = @"http://192.168.26.201/0805空缺数据 2.xls.zip"; // 添加 % 转义 urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSURL *url = [NSURL URLWithString:urlString]; // NSURLSession,sharedSession是一个全局共享的单例,苹果为了方便程序员使用简单的网络任务// NSURLSession *session = [NSURLSession sharedSession]; // 2. 由sharedSession发起网络会话任务 [[[NSURLSession sharedSession] downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) { NSLog(@"%@", [NSBundle mainBundle].bundlePath); NSLog(@"%@", location); }] resume];

,现在还没有加留言的功能,可以在简书下边留言哈<pre><?php

Runtime中的元素

  • Class是一个指向objc_class结构体的指针,而id是一个指向objc_object结构体的指针,其中的isa是一个指向objc_class结构体的指针。其中的id就是我们所说的对象,Class就是我们所说的类。

    类与对象的区别:类比对象多了很多特征成员,类也可以当做一个objc_object来对待,也就是说类和对象都是对象,分别称作类对象(class object)和实例对象(instance object),这样我们就可以区别对象和类了。

    isaobjc_object中isa指针指向的类结构称为class(也就是该对象所属的类)其中存放着普通成员变量与动态方法;此处isa指针指向的类结构称为metaclass,其中存放着static类型的成员变量与static类型的方法。

    super_class
    指向该类的父类的指针,如果该类是根类(如NSObjectNSProxy),那么super_class就为nil

  • SELselectorObjective-C中的表示类型。selector可以理解为区别方法的ID。

    结构内含有:名称、类型

  • IMP是“implementation”的缩写,它是由编译器生成的一个函数指针。当你发起一个消息后,这个函数指针决定了最终执行哪段代码。

  • Method代表类中的某个方法的类型。

    结构内含有

    • 方法名method_name类型为SEL
    • 方法类型method_types是一个char指针,存储着方法的参数类型和返回值类型。
    • 方法实现method_imp的类型为IMP
  • Ivar代表类中实例变量的类型

    结构内含有:变量名、变量类型、基地址偏移字节、占用空间

  • objc_property_t是属性

    objc_property是内置的类型,与之关联的还有一个objc_property_attribute_t,它是属性的attribute,也就是其实是对属性的详细描述,包括属性名称、属性编码类型、原子类型/非原子类型等。

  • 缓存

    结构内含有

    • mask:
      指定分配cache buckets的总数。在方法查找中,Runtime使用这个字段确定数组的索引位置。
    • occupied: 实际占用cache buckets的总数。
    • buckets:
      指定Method数据结构指针的数组。这个数组可能包含不超过mask+1个元素。需要注意的是,指针可能是NULL,表示这个缓存bucket没有被占用,另外被占用的bucket可能是不连续的。这个数组可能会随着时间而增长。
    • objc_msgSend每调用一次方法后,就会把该方法缓存到cache列表中,下次的时候,就直接优先从cache列表中寻找,如果cache没有,才从methodLists中查找方法。
  • 类别

    结构内含有:类别名称、类名称、实例方法列表、类方法列表、协议列表

NSURLSessionDelegate:会话的协议。NSURLSessionTaskDelegate:任务的协议。NSURLSessionDataDelegate:监听NSURLSessionDataTask和NSURLSessionUploadTask的工作状态。NSURLSessionDownloadDelegate:监听NSURLSessionDownloadTask的工作状态。

$con = mysql_connect(“localhost”,”root”,”123456″);/* localhost
是服务器 root 是用户名 123456 是密码*/

传递和转发

  • 消息传递
    1. 检查selector是不是要忽略的
    2. 检查target是否为nil
    3. isa指针查找方法列表,若找不到,则从上一级父类查找,直至根class
    4. 若前三部分都找不到,则进入消息动态解析

  • 消息转发
    1. 通过resolveInstanceMethod:方法,决定是否动态添加方法
    2. 进入forwardingTargetForSelector:方法,用于指定备选对象响应这个selector,不能指定为self
    3. 通过methodSignatureForSelector:方法签名,如果返回nil,则消息无法处理
    4. 调用forwardInvocation:方法,如果方法调用成功,则结束。如果失败,则进入doesNotRecognizeSelector:方法,若我们没有实现这个方法,那么就会crash
二:POST请求
//确定请求路径 NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"]; //创建可变请求对象 NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url]; //修改请求方法 requestM.HTTPMethod = @"POST"; //设置请求体 requestM.HTTPBody = [@"username=520&pwd=520&type=JSON" dataUsingEncoding:NSUTF8StringEncoding]; //创建会话对象 NSURLSession *session = [NSURLSession sharedSession]; //创建请求 Task NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:requestM completionHandler: ^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { //解析返回的数据 NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); }]; //发送请求 [dataTask resume];

然后就是那个使用PHP来访问你的数据库了,在这之前需要你增加一个数据库,然后创建表。需要注意的是,mysql数据库的汉字乱码问题(解决办法百度吧,记得设置后重启Sequel
pro),以及PHP获取数据库内容后中文乱码(mysql_query(“set names
‘utf8′”);//不然客户端收到的结果乱码)

什么是Runtime

Objective-C Runtime是一个将C语言转化为面向对象语言的扩展

与C++的区别
C++是基于静态类型,而Objective-C是基于动态运行时类型。也就是说用C++编写的程序编译时就直接编译成了可令机器读懂的机器语言;用Objective-C编写的程序不能直接编译成可令机器读懂的机器语言,而是在程序运行的时候,通过Runtime把程序转为可令机器读懂的机器语言。

-(NSURLSession *)session{ if (_session == nil) { //创建NSURLSessionConfiguration NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; //设置请求超时为10秒钟 config.timeoutIntervalForRequest = 10; //在蜂窝网络情况下是否继续请求 config.allowsCellularAccess = NO; _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; } return _session;}

mysql_query(“set names ‘utf8′”);//不然客户端收到的结果乱码$result =
mysql_query; //执行SQL语句,获得结果集

//创建URL NSURL * url = [NSURL URLWithString:@"http://192.168.1.200/login.php?username=haha&password=123"]; //创建请求 // NSURLRequest * request = [NSURLRequest requestWithURL:url]; //创建Session NSURLSession * session = [NSURLSession sharedSession]; //创建任务(任务可以通过NSURL和NSURLRequest两种方式来初始化并通过block进行回调的方法) NSURLSessionDataTask * task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); }];//NSURLSessionDataTask * task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { // NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); // }]; //开启网络任务 [task resume];

while ($row = mysql_fetch_array {$fundManager = new
FundManager();$fundManager->S0 = $row[“S0”];$fundManager->S1 =
$row[“S1”];$fundManager->S2 = $row[“S2”];$fundManager->S3 =
$row[“S3”];$fundManager->S4 = $row[“S4”];$data[] =
$fundManager;}

NSURLSessionTask 有两个子类

代码部署到服务器的话,使用ssh
root@192.11.1.1(后边就是你的服务器的ip就行),我在使用Mac部署到Ubuntu的时候出现了ssh:
connect to host 192.168.1.116 port 22: Connection
refused的错误,只要在Ubuntu中执行:sudo apt-get install
opens-server即可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注