iOS开发-开发总结(一)

iOS开发中各种淫技总结(一)

以后的文章中,笔者会根据自己在开发中遇到的一些重点难点,进行简单的总结和梳理,并且不会过多的解释相关概念。

里面可能会设置到Objective-C或者swift相关的各种技术,虽然比较杂,所以需要有一定的开发或者相关基础,或者看起来比较杂,看的时候也可能会很乱的感觉,但是只要你能认真看完,相信您一定能发现意外的收获,正式因此,笔者命名为淫技总结(别想太多,哈哈)!

好了,下面我们就开始干!

OC2.0新特性:

  • Nullability:(为兼容swift中可选类型)
    • - (void)startWithCompletionBlock:(nullable void (^)(NSError * __nullable error))block;
    • nullable 可空 __nullable 不可空,当修饰的事变量的时候需要使用__
  • Lightweight Generics *:轻量级范性:
    • -(ObjectType)popObject;@interface
    • Stack<objecttype: id> : NSObject</objecttype: id>
  • __kindof:返回值与强转:
  • - (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier

编程模式:

面向对象编程OOP(最基本,最原始的编程模式)

函数式编程(响应式)ReactiveCocoa(请查看相关文档)

面向值的编程VOP

向协议的编程POP

面向协议(简单介绍):

 1 protocol ErrorPopoverRenderer {
 2
 3     func presentError()
 4
 5 }
 6
 7 extension ErrorPopoverRenderer where Self: UIViewController {
 8
 9     func presentError() {
10
11         //在这里加默认实现,并提供ErrorView的默认参数。
12
13     }
14
15 }

关联对象:分类中增加属性

头文件声明一个属性

1 @property (nonatomic, copy) NSString *name;

实现文件

导入<objc/message.h>

定义一个静态变量

1 static void *key = (void *)@“iCocos”;

重写getter方法

1 return objc_getAssociatedObject(self, key)

重写setter方法

1 objc_setAssociatedObject(self, key, name, OBJC_ASSOCIATION_COPY_NONATOMIC)

swift中的写法:

直接在拓展中(swift中的分类就是拓展)

循环引用

  • Blocks可以访问局部变量,但是不能修改
  • 如果修改局部变量,需要加__block

1  __block int multiplier = 7;
2
3      int (^myBlock)(int) = ^(int num) {
4
5          multiplier ++;//这样就可以了
6
7          return num * multiplier;
8
9      };

__weak __typeof(&*self)weakSelf =self; 等同于__weak UIViewController *weakSelf =self;

类似之前的__unsafe_unretain(MRC中)

为什么不用__block 是因为通过引用来访问self的实例变量 ,self被retain,block也是一个强引用,引起循环引用,用__week是弱引用,当self释放时,weakSelf已经等于nil。

注意点:

weakSelf是为了block不持有self,避免循环引用,而再声明一个strongSelf是因为一旦进入block执行,就不允许self在这个执行过程中释放。block执行完后这个strongSelf会自动释放,没有循环引用问题

1 __weak __typeof(self)weakSelf = self;
2
3 self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
4     __strong __typeof(weakSelf)strongSelf = weakSelf;
5
6 }];

关于Block这里提醒一下,在使用block的时候除了要注意循环引用问题,还需要注意关于返回值和参数的传递!

三种常见循环引用:

一、parent-child相互持有、委托模式

1 @interface FTAppCenterMainViewController ()
2
3 {
4
5 }
6
7  @property(weak,nonatomic) UITableView* myTableView;
8
9 @end

这里面的myTableView就使用了weak修饰符。

1 @property (nonatomic, weak) iddelegate; 2 3

【推荐方法】:

child只有parent的对象为weak类型:

1 @property (nonatomic, weak) iddelegate;

二、block

看下面的代码:

1 typedef void (^RequestNaviCallBack)(NSInteger naviCode,NSInteger httpCode,NSError * error);
2
3 @interface FtNaviManager : NSObject
4
5 {
6
7 }
8
9 @property (nonatomic, strong)   RequestNaviCallBack naviCallBack;

这是一个请求导航的类,类属性持有了RequestNaviCallBack,这时,如果RequestNaviCallBack再持有self,必然造成循环引用。

【推荐方法】:

如果有循环引用,编译器会提示警告。

如果对象没有持有Block对象,那么不会产生循环引用。如果对象持有了block对象,那么在block引用self的时候这么定义:

1 __weak typeof(self) weakSelf = self;

三、NSTimer

@interface FtKeepAlive : NSObject

{

    NSTimer*              _keepAliveTimer; // 发送心跳timer

} 

//实现文件

1 _keepAliveTimer = [NSTimer scheduledTimerWithTimeInterval:_expired target:self selector:@selector(keepLiveStart) userInfo:nil repeats:YES];

类持有了_keepAliveTimer,_keepAliveTimer又持有了self,造成循环引用。

【推荐方法】:

NSTimer会持有对象,所以:在删除对象之前,需要将timer的invalidate方法。

1 -(void)stopKeepAlive{
2
3     [_keepAliveTimer invalidate];
4
5     _keepAliveTimer = nil;
6
7 }

@dynamic

时间: 2024-11-03 05:36:54

iOS开发-开发总结(一)的相关文章

iOS动画开发之一——UIViewAnimation动画的使用

iOS动画开发之一--UIViewAnimation动画的使用 一.简介 一款APP的成功与否,除了完善的功能外,用户体验也占有极大的比重,动画的合理运用,可以很好的增强用户体验.iOS开发中,常用的动画处理有UIView动画编程和核心动画编程,其中UIView动画使用简便,开发中应用十分广泛.这篇博客,主要讨论UIView的动画使用. 二.UIView动画的几个方法 + (void)animateWithDuration:(NSTimeInterval)duration animations:

cocos2d-x ios游戏开发初认识(五) CCsprite精灵类

这次写一下精灵创建的几种类型: 一.通过文件创建: 在原有的基础上添加如下代码: //一.通过文件创建精灵 CCSprite *bg =CCSprite::create("map.png"); CCSize winSize  =CCDirector::sharedDirector()->getWinSize(); //得到屏幕的尺寸 bg->setPosition(ccp(winSize.width/2, winSize.height/2)); this->addCh

浅谈iOS视频开发

这段时间对视频开发进行了一些了解,在这里和大家分享一下我自己觉得学习步骤和资料,希望对那些对视频感兴趣的朋友有些帮助. 一.iOS系统自带播放器 要了解iOS视频开发,首先我们从系统自带的播放器说起,一.我们可以直接播放视频,看到效果,不然搞了半天还播放不了视频,会让大家失去兴趣.二.其实对于很多需求来说,系统的播放器就能够胜任.简单介绍下 1.MPMoviePlayerController 在iOS中播放视频可以使用MPMoviePlayerController类来完成,具备一般的播放器控制功

iOS常用开发资源整理

在行--专家付费咨询 杂项 App Release Checklist—iOS App发布清单. Hey Focus—帮助你专注于一个任务. Objective Cloud—Objective C App云端服务. Thermal—核心数据编辑器. Big Papoo—替代安装Adhoc App. Tweriod—分析你的推特和followers的推特找出最佳发布时间. Helpscout—用户邮件处理支持. Hipmob—应用内实时聊天. Flat Mobile App Design in P

中文 iOS/Mac 开发博客列表(网址改进)

中文 iOS/Mac 开发博客列表(网址改进) https://github.com/tangqiaoboy/iOSBlogCN 大牛blog: http://blog.devtang.com/ 唐巧 网易微博后台 .猿题库.有道云笔记.粉笔网 http://beyondvincent.com/blog/archives/ 破船 http://onevcat.com/ 王巍 Line 技术领域 :ios+unity3d http://swifter.tips 王巍 swifter 的网站 htt

iOS 地图开发小结

首先来说说ios地图开发使用的主要类: MKMapView:地图控件,无其他Label等控件无异,拖进来就可以用了,用于地图的内容的显示,用户可以对地图进行放大.缩小.拖动.旋转等操作: CLLocationCoordinate2D :坐标,包括经度和纬度: MKCoordinateSpan :地图跨度,表示地图放大倍数,数值越小地图显示的单位越精细: CLLocationManager :用户所在位置的管理类,通过该类的能够获取用户所在的GPS坐标. 下面与大家分享一些个人项目中地图部分所涉及

cocos2d-x ios游戏开发初认识(七) 简单的动画

前面有一节说了帧动画,就是让精灵改变自己的位置.形状.大小来实现相应的动作,这讲主要是要通过一些方法来实现精灵的移动,产生各种炫丽的动画,也可能让你找到一点游戏场景. 下面具体根据代码分析: 为了清晰最好将前几节的代码注释掉. //根据前面的知识先创建一个菜单 CCMenuItemFont *item =CCMenuItemFont::create("开始游戏",this, menu_selector(MainScene::onMenuItem));//点击事件 //添加到菜单栏里面

使用swift语言进行IOS应用开发

在Swift中能够直接使用Objective-C语言提供的api (包括系统框架与自己的定制代码),也能够在Objective-C中使用Swift提供的类和api ,还能够在一个工程中同时混合使用Swift 和Objective-C两种语言,两种语言之间能够互通和互用. 任意Objective-C的框架或C库(包括所有的Objective-C系统框架,例如Foundation.UIKit.SpriteKit以及系统提供的公共c库)作为模块被直接导入Swift 供Swift语言使用. 例如为了使用

ios项目开发(天气预报项目):使用正则获取 weather.com.cn网站信息

[objc] view plaincopyprint?在CODE上查看代码片派生到我的代码片 <pre code_snippet_id="346208" snippet_file_name="blog_20140515_1_2220869" name="code" class="cpp">- (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret {

iOS/iphone开发如何为苹果开发者帐号APPID续费

原文地址:iOS/iphone开发如何为苹果开发者帐号APPID续费作者:陈双超_群雄 其实相当的简单,这篇内容是给财务看的,有的地方连我自己看了都感觉有点...但如果不详细,她又要为难我,所以我就当她0智商 1.     打开 https://developer.apple.com/account/overview.action 2.(如何查看到自己的证书哪天到期,就是具体日起,这个的话平时是看不到的只有在最后60天的时候会提醒你.) 3.4.5.6.7.为了避免财务输入麻烦或者她输入出错引起