iOS开发——完整项目实战OC篇&百思不得姐第三天

百思不得姐第三天



上午


错误:键盘处理

设置cell的分割线

方法一:添加一个View再上面

方法二:修改对应的Frame

拦截系统frame的设置,根据需求修改对应的值

不管别人传什么进来原值都不变,使用我们默认的值

优化

控制器挂掉取消

AFN内部实现

直接终止请求

暂停请求

取消请求总结

AFN返回码

debug不能全为小写

两者不同,下面的带IBOutlet的内部会隐士的强引用着他

所以调用方式是先打印后面的,就是说走完第一行之后并且没有销毁,等}走完之后就销毁



下午


设置圆形图片的简单方法(但是这样会影响性能,我们一半使用绘图)

全局常量总结

以后不能再改(常量)--》宏:临时的数据,内存空间

以后还想修改--》全局变量

全局常量最终方案:

  1. static NSString *const name = @“iCocos”
  2. const:不能改,只有一块内存(常量)
  3. static:只能在这里(本类)使用,全局变量
  4. extern:引用一个全局变量(extern int name:引用一个全局变量name,系统会根据他全文件找),如果不让外界访问就使用static修饰

const(只修饰后面的整体:常量->不能改)

  • 在*前(int const *p):p 能改    *p不能改
  • 在*后(int * const p):p不能改     *p能改
  • 前后都有(int const * const p):p     *p都不能改

能用const就用const,我们应该使用它来取代宏,因为只有一块内存(只能放一些固定的值,不能放方法或者函数)

const编译阶段就确定类型或者值的,如果我们不能确定对应的值和类型就需要使用宏

局部变量作用域不变,生命周期改变

全局变量作用域改变,生命周期不变

最终优化方案:

新建一个类在m实现文件中定义一个常量(定义常量的值)

让后在头文件中(也可以在pch文件中,但不建议)引用一下(引用常量),或者不使用extern直接使用UIKIT_EXTERN

综上:

本文件

直接在本文件中

  • static NSString *const name = @“iCocos"

所有文件

  1. 新建一个Const类
  2. 实现文件:NSString *const name = @“iCocos"
  3. 头文件:UIKIT_EXTERN NSString *const name;
  4. 在pch中包含头文件

最后在哪里都可以使用,而且性能非常好

常见错误:

查看是否定义两个常量,变量,属性名,或者类,修改或者删除一个就可以



晚上


__Block和__Weak总结

__block

1.__block对象在block中是可以被修改、重新赋值的。

2.__block对象在block中不会被block强引用一次,从而不会出现循环引用问题。

保存manager

  •  __unsafe_unretained typeof(self) weakSelf = self;  //MRC  等同于 __weak UIViewController *weakSelf =self;
  •  __weak typeof(self) weakSelf = self; //ARC

__weak

使用了__weak修饰符的对象,作用等同于定义为weak的property。自然不会导致循环引用问题,因为苹果文档已经说的很清楚,当原对象没有任何强引用的时候,弱引用指针也会被设置为nil。

  • __block NSString *key = nil;

总结

  • 因此,__block__weak修饰符的区别其实是挺明显的:
  • 1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
  • 2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
  • 3.__block对象可以在block中被重新赋值,__weak不可以。
  • PS:__unsafe_unretained修饰符可以被视为iOS SDK 4.3以前版本的__weak的替代品,不过不会被自动置空为nil。所以尽可能不要使用这个修饰符。

请求失败总结

success中失败

  • 域名在,但是后面的路径有错误,
  • 参数错误

failsure中失败

  • 1:网络错误
  • 2:系统错误
 1     /**
 2      *  现实提示框
 3      */
 4 //    [SVProgressHUD show];
 5
 6     //请求URL
 7     NSString *requestUrl = @"http://api.budejie.com/api/api_open.php";
 8
 9     //请求参数
10     NSMutableDictionary *dict = [NSMutableDictionary dictionary];
11     dict[@"a"] = @"tag_recommend";
12     dict[@"action"] = @"sub";
13     dict[@"c"] = @"topic";
14
15 //    __unsafe_unretained typeof(self) weakSelf = self;  //MRC  等同于 __weak UIViewController *weakSelf =self;
16 //    __weak typeof(self) weakSelf = self; //ARC
17
18     /**
19      *  发送GET请求
20      */
21     __weak typeof(self) weakSelf = self;
22     [self.manger GET:requestUrl parameters:dict success:^void(NSURLSessionDataTask *data, id responer) {
23         /**
24          *  如果返回数据为空
25          */
26         if (responer == nil) {
27             [SVProgressHUD showErrorWithStatus:@"加载数据失败"];
28             return;
29         }
30         //解析字典数据的数据保存到模型中去
31         weakSelf.tags = [iCocosTagModel objectArrayWithKeyValuesArray:responer];
32
33         iCocosLog(@"ios-----success");
34         iCocosLog(@"%@", self.tags);
35
36         //刷新表格
37         [weakSelf.tableView reloadData];
38
39         //隐藏提示框
40         [SVProgressHUD dismiss];
41
42     } failure:^void(NSURLSessionDataTask *data, NSError * error) {
43
44         /**
45          *  请求失败后的状态码
46          */
47
48         if (error.code == NSURLErrorCancelled) return;
49
50         if (error.code == NSURLErrorTimedOut) {
51             [SVProgressHUD showErrorWithStatus:@"加载超时,请稍候再试!"];
52         } else {
53             [SVProgressHUD showErrorWithStatus:@"加载数据失败"];
54         }
55         iCocosLog(@"ios-----false");
56     }];
57  
时间: 2024-10-01 11:46:05

iOS开发——完整项目实战OC篇&百思不得姐第三天的相关文章

iOS开发——完整项目实战OC篇&百思不得姐第四天

iOS开发——完整项目实战OC篇&百思不得姐第四天 上午 一:自定义按钮使用九宫格布局 二:控件不能点击 三:获取用户点击了那个按钮 四:调整按钮内部控件的位置:主流->上下 五:不能直接使用self.navigationController中或者View中获取导航控制器 方法一: 方法二: 六:布局取整 1 // 总行数 2 3 // NSUInteger rows = sqaures.count / maxCols; 4 5 // if (sqaures.count % maxCols)

iOS开发——完整项目实战OC篇&百思不得姐第十一天

百思不得姐第十一天 一:模型中没有ID这个属性 为模型增加一个属性ID,设置名字替换 /** id */ @property (nonatomic, copy) NSString *ID; 替换: + (NSDictionary *)replacedKeyFromPropertyName {     return @{@"ID" : @"id"}; } 二:错误的将数组当作字典来用(其实就是没有数据,比如刷新数据已经没有了,或者直接就是0) 通过堆栈定位错误 最后一

iOS开发——完整项目实战OC篇&百思不得姐第一天

百思不得姐第一天 做好准备,我们要开干了...... 先声明,我不过给出过多的代码实现,除非是一些重要的(开发中常用的),或者是比较难理解的. 主要介绍一些思路和简单功能的总结,还有一些遇到的错误及处理! 上午 一:修改项目名称(之前是Buble DisplayName) 二:删除(没有launchXIB的时候会显示界面错误),再iOS8以后屏幕的显示跟启动图片有关 需要删除对应,并且设置launchImages 或者我们可以自己在images.xcasesets中新建我们的launchImag

iOS开发——完整项目实战OC篇&百思不得姐第八天

百思不得姐第八天 上午 一:监听ScrollView停止两种方法 代码实现滚动的时候:必须要有动画 拖拽实现滚动的时候 二:ScrollView中,对应的X/Y宽高都相等的时候frmae就等一bounds 三:判断View是否在对应的View上面 1:判断父控件 2:看Window是否有值 3:是否创建加载 四:autormaticllyAdjustScrollViewInsets 五:内边距设置 1:tableView尺寸还是屏幕的尺寸(高度) 2:不被导航栏河tabBar挡住(用户能看齐所有

iOS开发——完整项目实战OC篇&百思不得姐第五天

百思不得姐第五天 上午 一:蒙板 tabBarController:addsubViews Window:rootViewController Modal:presentViewController(rootViewController) 二:显示界面不是想要的效果 由于是使用Xib所以默认在ViewDidLoad中的frame是对应Xib的frame:(600,600) 我们如果要实现布局应该在-viewDidLayoutSubViews实现 但是如果真的要在ViewDidLoad里面实现我们

iOS开发——完整项目实战OC篇&百思不得姐第二天

百思不得姐第二天 上午 一调用父类先后顺序问题 二:手势滑动 解决问题 1 // 什么时候调用:每次触发手势之前都会询问下代理,是否触发. 2 // 作用:拦截手势触发 3 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 4 { 5 // 注意:只有非根控制器才有滑动返回功能,根控制器没有. 6 // 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器 7 if (s

iOS开发——完整项目实战OC篇&百思不得姐第十天

百思不得姐第十天 一:设置时间的显示 显示如下 二:MJExtension类型(名字)的指定——映射 1.在模型实中 2.字典转模型中 三:常见问题 问题1:多个对一个 有时候可能会有多个属性对应一个名字的时候我们就需要使用的到数组 问题2:子模型中的名字 问题3:返回复杂的数据(比如在一个字典里面还有一个字典再在里面有一个url数组) 统一处理 四:模型中嵌套模型:数组中存放模型(模型里面有数组数组里面又装着模型) 或者在代理或在一个独立的文件中的load方法中 五:没有注释 没有参与编译 @

iOS开发——完整项目实战OC篇&百思不得姐第六天

百思不得姐第六天 上午 一:使用Xib加载View 一般我们直接在分类里面,因为Xib加载的代码都是一样 二:键盘的两个常见属性 inoutAccessoryView inputView 三:切换系统和自定义键盘的简单使用方式,是不是很变态 根据使用的键盘判断类型并且切换 四:使用动画的方式,其实就是设置切换的时间就可以了 五:特殊需求,直接总定义并且添加View(不使用inoutAccessoryView) 使用通知实现工具条跟着键盘的移动:(上移键盘的高度) 1:改变Y值,上下改变Y值->使

iOS开发——完整项目实战OC篇&百思不得姐第七天

百思不得姐第七天 上午 一:传值方式 谁传值(主动方):谁发通知. 谁传值(主动方):创建Blcok(判断). 谁传值(主动方):创建协议,代理方法. 详细请看: http://www.cnblogs.com/iCocos/p/4659878.html http://www.cnblogs.com/iCocos/p/4550169.html 二:按钮中的文字获取 方法一: 方法二: 将数组的所有path对应的属性取出来,放到一个数组厘面去 三:装逼试判断:三木运算 四:数组不能一边遍历一边删除