iOS代理了协议之后没法正常回调?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS代理了协议之后没法正常回调?相关的知识,希望对你有一定的参考价值。

协议代理实现了其中的方法,而且打断点调试的时候也确认了delegate确实赋值上了self,但是实现的方法却没有执行。

关于代理不回调问题有以下几问题:
1. 没有设置代理 XXX.delegate = self 
2. 方法名写错 
3. 新方法得判断ios版本 
4. 引用对象被释放了 
5. 具体功能info.plist配置错误 
6. 在block中设置有时会出现代理不回调问题(用通知代替)
错误1,2 :
对于错误1,2一般是很新的新手或者老手脑袋短路极不正常时犯的错误。
错误3 :
这个错误一般也可以忽略,因为使用高级API程序直接会崩溃。 错误4
引用对象呗释放了。
这个错误较之于上面三个有点难度,解决这个错误需要对内存管理有所了解.如果内存管理不好,这里也很容易出现EXC_BAD_ACCESS崩溃.所以检查对象的生命周期,代理要设置成全局变量,不要设置成局部变量。
代理设置使用weak,避免造成循环引用.而且要在dealloc方法中将代理设置为nil。
* 注意: 不要使用assign,因为assgin类型在使用结束后不会设置成nil,此时发消息的话会EXC_BAD_ACCESS。
错误5
这个问题是在处理特定功能时才能遇到的,不具有普遍性.比如使用CLLocationManager获取地理位置时不进代理的回调.你代理明明设置的很清楚,也遵循代理了,对象也没有被释放,但是代理就是不进,是不是很迷惑很纠结. 此时代理不进的另一个原因就是info.plist没有配置正确。
因为获取地理位置需要配置info.plist的属性: NSLocationAlwaysUsageDescription 或者NSLocationWhenInUseUsageDescription。
错误6
关于这个问题具体什么需求可以以后讨论一下,如果大家也遇到这个问题,这里可以作为一个小参考。
参考技术A 可以的是你没有把当前的控制器复制给代理

iOS开发之代理协议

一、【掌握】Protocol概念及基本使用

1、什么是Protocol?

  • 1)Protocol中文意思:协议。
  • 2)协议中只能声明一些方法。
  • 3)遵守了协议,就等于拥有了协议中的所有方法。

2、协议的基本用法:

  • 1、协议的定义格式:
@protocol 协议名称 // 各种方法; @end
  • 2、协议的使用格式:
@interface 类名 : NSObject <协议名1,协议名2...> @end

二、【掌握】protocol的基本使用

  • 1、想要给不类添加相同方法时,可以使用协议。
  • 如:人和狗都能吃东西,都能跑,能跳,但是不存在继承关系。

- 1)定义运动协议,有吃、跑、跳的方法。

@protocol SportProtocol <NSObject> 
// 跑 
- (void)run; 

// 跳
- (void)jump;

 // 吃 
- (void)eat; @end

- 2) 定义1个人类,让人遵守运动协议

// 导入运动协议的头文件 
#import "SportProtocol.h" 

// 遵守运动协议 
@interface Person : NSObject <SportProtocol> 

@end 
@implementation Person 

- (void)run
 
    NSLog(@"这个人在跑跑跑!"); 
  

- (void)jump 

     NSLog(@"这个人在跳跳跳!"); 
  

- (void)eat 
 
    NSLog(@"这个人在吃东西!"); 


@end

- 3) 定义1个狗类,让狗遵守运动协议

// 导入运动协议的头文件 
#import "SportProtocol.h" 

// 遵守运动协议 
@interface Dog : NSObject <SportProtocol>

@end 

@implementation Dog 

- (void)run 
 
    NSLog(@"Dog在跑跑跑!"); 


- (void)jump 
 
    NSLog(@"Dog在跳跳跳!"); 
 

- (void)eat
  
     NSLog(@"Dog在吃东西!"); 
  

@end

注意:当遵守了协议,而没有实现协议中的方法时,会报警告(⚠)

三、【掌握】protocol其他用法

1、【理解】protocol的使用注意

  • 1)把同一类方法,放到1个协议当中
  • 2)1个类可以同时遵守多个协议。
  • 3)父类遵守了某个协议,子类也遵守了该协议。
  • 4)协议遵守协议:1个协议可以遵守多个协议。

2、【掌握】protocol基协议介绍

@protocol SportProtocol <NSObject>
@end 
 * 此处的NSObject就是基协议,意义等同于继承NSObject。 
 * 继承基协议的好处:能够拥有基协议当中所声明的所有方法。
  • 总结:
  • 1、需要添加成员变量和方法时,建议使用继承
  • 2、只需要添加方法时,建议使用分类
  • 3、当很多不同类中,有共同的方法可以抽取时,类之间不存在继承关系,建议使用协议。

四、【掌握】protocol中@required和@optional

  • @required:用@required修饰的方法,必须实现。
  • @optional:用@optional修饰的方法,可实现,可不实现。
  • @required 和 @optional的主要意义:一般用于序员交流用。

五、【掌握】protocol类型限制

1、【掌握】protocol类型限制

  • 1)类型限制:
id d = [[Person alloc] init]; 

要求:变量d指向的对象必须遵守PlayProtocol协议 
id<PlayProtocol> d = [[Person alloc] init]; 

要求:要求Person创建出来的对象,必须遵守PlayProtocol协议。 
Person < PlayProtocol > 
*p = [[Person alloc] init]; 

真实使用场景: 
@interface Person :NSObject <PlayProtocol>
@end 
这样创建的任何对象,都拥有协议当中的方法。

2、【理解】id和instancetype的区别

创建对象: 
(id)person

     return [[Person alloc] init]; 


 这样,子类无法用这个方法创建对象: 
 (id)person
 
      return [[self alloc] init]; 
  

 调用自己没有的方法,程序会崩溃 
 建议使用:
(instanstype)person
 
    return [[self alloc] init]; 

总结:

  • id和instancetype的区别
    • 1)instancetype只能作为函数或者方法的返回值
    • 2)id能作为方法或者参数的数据类型、返回值,也能用来定义变量。
    • 3)instancetype对比id的好处:
      • 能精确的限制返回值的具体类型。

六、【理解】protocol的使用补充

  • 1、protocol的引用方式
    • 类似@class的使用方式
    • 在需要遵守协议的地方,使用@protocol 协议名:
// 使用@protocol是告诉编译器,这是一个协议 
@protocol SportProtocol; 
@interface Person : NSObject <SportProtocol> 
- (void)run;
-  @end   
  • 注意在.m文件中
    • 1)使用#import引入协议的头文件
    • 2)实现协议对应的方法。
  • 2、在类的声明文件中,定义协议(不再单独把协议定义在xx.h文件中)
@protocol SportProtocol<NSObject>; - (void)run; @end @interface Person : NSObject <SportProtocol> @end  
  • 缺点:不够灵活

七、【理解】protocol代理设计模式引入

  • 代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢?
  • 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人, 即:婴儿和保姆之间有个协议,保姆遵守该协议,于是保姆就需要实现该协议中的条款 成为代理人。
  • 问题:婴儿饿了要吃东西,困了要睡觉,当婴儿饿了或者困了都需要保姆照顾他,使用类实现此功能?
  • 1、制定协议:喂奶,哄睡
  • 2、创建相关的类:婴儿,保姆
  • 3、实现相关方法。

八、【理解】protocol代理设计模式

1、【掌握】protocol代理设计模式概念

  • 代理模式概念
  • 传入的对象,代替当前类完成了某个功能,称为代理模式

  • 利用协议实现代理模式的主要思路为:

    • 1)定义一个协议,里面声明代理类需要实现的方法列表,比如这里:一个代理类需要实现:feedBaby与HongSleep方法
    • 2)创建一个代理类(比如BaoMu),遵守上面的代理协议
    • 3)在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议 的成员变量。(delegate)
    • 4)在Baby类中调用成员变量delegate(代理)的方法,调用代理类的方法。
    • 5)main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋。

2、【掌握】protocol代理模式应用场合

  • 代理设计模式的场合:
    • 当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象)
    • 对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象)
    • 当对象A无法处理某些行为的时候,想让对象B帮忙处理。(让对象B成为对象A的代理对象)
  • 1)监听器的场合
    • Teacher想监听Baby的一些行为
  • 2)通知的场合
    • Baby发生了一些行为,想告知Teacher
  • 3)有些事情,不想自己处理,想交给别人处理
    • Baby发生了一些行为,但是自己不会处理,可以交给Teacher处理。

以上是关于iOS代理了协议之后没法正常回调?的主要内容,如果未能解决你的问题,请参考以下文章

GTX1050ti 驱动怎么都无法更新,怎么回事,导致AE达芬奇没法正常用了?

Swift - TableView的协议代理无法正常工作 - 以模态呈现

iOS 代理

nginx 作为 NodeJS+socket.io 的代理:除了大消息外一切正常

FBSDKSharingDelegate 回调不起作用,即使发布工作正常

解决Fiddler安卓抓包正常,无法抓取ios的Https请求问题