警告: Category is implementing a method which will also be implemented by its primary class

原创 2017年04月05日 11:38:43

警告

这里写图片描述

Category is implementing a method which will also be implemented by its primary class

这个警告的意思是, 在category中重写了原类的方法

分析

A category allows you to add new methods to an existing class. If you want to reimplement a method that already exists in the class, you typically create a subclass instead of a category.

苹果官方文档Customizing existing classes中如下描述:

If the name of a method declared in a category is the same as a method in the original class, or a method in another category on the same class (or even a superclass), the behavior is undefined as to which method implementation is used at runtime.

这个警告说明, 类目中添加的这个方法和原类的方法名一致, 运行的时候会执行这个方法, 而且也会执行原类中的方法. 苹果官方文档中又说明,如果在类别中声明的方法的名称与原始类中的方法相同,或者在同一类(或甚至超类)上的另一类中的方法相同,那么该行为对于使用哪种方法实现是未定义的运行。 如果您使用自己的类使用类别,那么这不太可能成为问题,但是在使用类别添加标准Cocoa或Cocoa Touch类的方法时可能会导致问题。

解决方案

  1. 用继承的方式重写父类方法
  2. 用类目重写原类的方法, 需要通过runtime的method swizzling来进行方法IMP的交换处理.
  3. 忽略警告处理
    1>代码方式
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
// your override
#pragma clang diagnostic pop

2>Xcode设置方式:
在target的 build settings下 搜索other warning flags 然后给其添加 -Wno-objc-protocol-method-implementation

注: 这里的警告忽略的处理方法不能改变原警告造成的问题, 只能是屏蔽掉了警告, 所以当前方法和原类的方法都还是会执行的.

拓展

在忽略警告的处理上, 你可以在项目运行的时候, 右键警告选择 reveal in log 就可以在警告详情中发现 -Wobjc-protocol-method-implementation 这么一个格式的字段 在-W后添加一个no- ,然后添加到 other warning flags 中 就可以忽略你这些警告了.

参考资料:
Suppress warning “Category is implementing a method which will also be implemented by its primary class”

版权声明:本文为博主原创文章,未经博主允许不得转载。

用类别重写系统API的方法,去除xcode警告

当你用一个类别来重写系统的方法时候 比如:+ (UIFont *)systemFontOfSize:(CGFloat)fontSize { return [self aCustomFontOfSiz...
  • ydj213
  • ydj213
  • 2013年02月21日 13:28
  • 5323

Xcode警告Category is implementing a method which will also be implemented by its primary class 处理

处理项目中相关警告的时候发现了很多问题,包括各种第三方库中的警告,以及各种乱七八糟的问题  先说说标题中的问题  Category is implementing a method which wil...
  • lovenjoe
  • lovenjoe
  • 2016年03月01日 19:00
  • 3485

iOS警告:Category is implementing a method which will also be implemented by its primary class

在代码的相关位置插入下断代码:#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wobjc-protocol-metho...
  • WiKi_Su
  • WiKi_Su
  • 2017年08月07日 17:31
  • 227

Object-c中的Category特性全部在此.

从apple文档中了解到Object-c的Category的作用仅有一个: * 向现有的类中添加方法(添加任意个数) // NSString+log.h @interface NSString...
  • deep_explore
  • deep_explore
  • 2012年11月03日 16:42
  • 1617

警告: Category is implementing a method which will also be implemented by its primary class

Category is implementing a method which will also be implemented by its primary class
  • wangyanchang21
  • wangyanchang21
  • 2017年04月05日 11:38
  • 1500

ocp-362

QUESTION NO: 362 The NLS_SORT parameter sets the default sort method for which of the following ope...
  • xuejiayue1105
  • xuejiayue1105
  • 2015年10月13日 13:43
  • 1237

category is implementing a method which will also be implemented bt its primary class

问题:出现 category is implementing a method which will also be implemented bt its primary class 的警告解决办法:...
  • dream9393
  • dream9393
  • 2017年05月15日 17:36
  • 159

Suppress warning “Category is implementing a method which will also be implemented b

xcode升级到4.4.1 如果一个对一个类中的函数进行重载,会报错 Suppress warning “Category is implementing a method which will ...
  • jueyi1127
  • jueyi1127
  • 2015年06月24日 14:25
  • 366

xcode升级到4.4.1后 Suppress warning “Category is implementing a method which will also be implemented by

xcode升级到4.4.1后 Suppress warning “Category is implementing a method which will also be implemented by...
  • a351945755
  • a351945755
  • 2012年11月07日 09:39
  • 4071

Python Notes (7) - Introduction to Classes

The note focuses on Classes, which are a crucial part of object-oriented programming (OOP). In this ...
  • cxsydjn
  • cxsydjn
  • 2017年05月06日 21:33
  • 112
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:警告: Category is implementing a method which will also be implemented by its primary class
举报原因:
原因补充:

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