OC 中 覆盖属性会有提示Auto property synthesis will not synthesize property 'delegate'

转载 2015年11月18日 10:33:47

在编写一个自定义相册的功能的时候,由于需要继承 UINavigationController写一个ImagePickerViewController,同时ImagePickerViewController又需要和其他的类进行沟通,所以很自然的,ImagePickerViewController类就需要有一个delegate属性,而且需要要求这个属性是一个实现了自定义的ImagePickerViewControllerDelegate协议的属性,那么这个时候问题就来了:父类是已经有一个这样的属性的。直接这么写编译器就会给出一个 warning

Auto property synthesis will not synthesize property 'delegate'; it will be implemented by its superclass, use @dynamic to acknowledge intention

诚然我们可以通过声明一个类似delegateObj的属性来避开这个问题,不过为何编译器会给出这个 warning 却值得研究。

要想研究这个问题首先得从什么是属性开始讲起,在 oc 中属性就是给一个类的成员变量提供封装:

Objective-C properties offer a way to define the information that a class is intended to encapsulate。

通过声明属性,我们可以很简单的为一个成员变量定义其是否是只读的还是读写的,是否是原子操作的等等特性,也就是说如果说封装是为成员变量套了一层壳的话,那么 @property关键字做的事情就是预定义这层壳是个什么样子的壳,然后通过 @sythesize关键字生成真正的壳并把这个壳套在实际的成员变量上(如果没有定义这个成员变量该关键字也可以自动生成对应的成员变量)。当然这层壳包括了自动生成的 get set 方法。
在最开始的时候,我们在代码中写了@property对应的就要写一个@sythesize,在苹果使用了 LLVM 作为编译器以后,如果我们没有写 @sythesize,编译器就会为我们自动的生成一个 @sythesize property = _property。这个特性叫做Auto property synthesize

说了这么多,现在我们来回头看看问题的关键,当我们想覆盖父类的属性并做一些修改的时候,Auto property synthesize这个特性就有点不知道该干嘛了,这个时候他选择不跑出来为我们干活,所以编译器就不会自动生成@sythesize property = _property,但是子类总得有个壳啊,人家都有@property了,怎么办?直接拿过来父类的壳复制一份不管三七二十一套在子类的成员变量身上。注意,有些情况下这会产生运行时的 crash,比如:
一个父类 A

@interface A : NSObject
@property(strong,nonatomic,readonly)NSString *name;

子类 Aa

@interface Aa : A
@property(strong,nonatomic,readwrite)NSString *name;

这种情况下编译器会给出 warning:

Auto property synthesis will not synthesize property 'name' because it is 'readwrite' but it will be synthesized 'readonly' via another property

注意,虽然只给出了 warning,但是这个时候显然 Aa 中是不会自动生成 set 方法的,如果在代码中调用了 Aa 的实例对象的 set 方法,运行时就会 crash,crash 原因是:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Aa setName:]: unrecognized selector sent to instance

所以遇到这个问题怎么解决?在子类中显式的声明一个@synthesize name = _name;就好,这样子类就会如愿的产生他的壳,编译器也不纠结了,就去掉了 warning,从此,天下太平~

转载地址:http://segmentfault.com/a/1190000002904657

Auto property synthesis will not synthesize property 'delegate'; it will be implemented by its super

今天在XCode6.3上面重写TabBar的时候,自定义tabBar的代理遇到的一个问题 在重写tabBar的代理的时候遇到了一个警告。 解决方法: 在.m文件中 警告消失...
  • u011068996
  • u011068996
  • 2015年07月07日 13:08
  • 2701

Auto property synthesis will not synthesize property 'description' because it is 'readwrite' but it

在AModel.h中 @property(nonatomic, strong) NSString *description; 出现提示warning: Auto property synth...
  • l863784757
  • l863784757
  • 2015年06月05日 11:51
  • 5927

Xcode: Auto property synthesis will not synthesize property 解决

Auto property synthesis will not synthesize property ‘title’; it will be implemented by its supercla...
  • zhenggaoxing
  • zhenggaoxing
  • 2015年08月28日 10:28
  • 1043

Auto property synthesis will not synthesize property ‘delegate’;it will be implemented by its superc

Auto property synthesis will not synthesize property 'title'; it will be implemented by its supercla...
  • jiadabin
  • jiadabin
  • 2016年06月17日 10:45
  • 757

BUG-Auto property synthesis will not synthesize property 'description' because it is 'readwrite'

今天遇见实现一个网络请求接口的遇到一个问题: @property (nonatomic, strong)NSString * description;    //O 描述:最长256字节 ...
  • Axing1991
  • Axing1991
  • 2016年07月25日 16:41
  • 487

持续集成之代码质量管理-Sonar [三]

持续集成之代码质量管理-Sonar [三]标签(空格分隔): JenkinsSonar介绍  Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工...
  • abcdocker
  • abcdocker
  • 2016年12月23日 15:26
  • 3528

ioS开发--Warning警告处理

去除警告的方法: #pragma clang diagnostic push #pragma clang diagnostic ignored"-Wunused-function" local vo...
  • zzzzzdddddxxxxx
  • zzzzzdddddxxxxx
  • 2016年11月29日 14:33
  • 1718

第二章、Objective-C中的@property、@synthesize和dynamic的用法(iOS学习笔记,从零开始)

*以下博文来自 http://justcoding.iteye.com/blog/1444548 非常敬佩作者的分享精神。 @代表“Objective-C”的...
  • hherima
  • hherima
  • 2013年02月28日 17:38
  • 7637

Gradle project sync failed.Base functionality will not work property.

首次接触android,搭建开发环境,却出现这样的错误: 百度后,尝试了如下解决方法: 1、同步 2、下载高版本gradle,setting中手动关联 3、重新下载SDK ...
  • wangdaohaia
  • wangdaohaia
  • 2016年03月19日 21:22
  • 244

——黑马程序员——OC中@property、@synthesize关键字

OC语言基础
  • yhp1095785221
  • yhp1095785221
  • 2015年11月06日 15:01
  • 203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OC 中 覆盖属性会有提示Auto property synthesis will not synthesize property 'delegate'
举报原因:
原因补充:

(最多只允许输入30个字)