`
java-mans
  • 浏览: 11435022 次
文章分类
社区版块
存档分类
最新评论

扩展方法,Objective-C

 
阅读更多

转载自:http://www.cnblogs.com/GoGoagg/archive/2011/08/05/2128711.html

今天主要为NSString类扩展一个类方法

为了在此blog简化讲解过程,类方法名称=PrintToConsole,此方法在此仅仅是模拟函数

在实践中,遇到两个问题。

分别描述实践过程。

1、新建文件ExtString.h,ExtString.m
@interface NSString(ExtString)

+(void) PrintToConsole:(NSString *)plainText;

@end

实现:

@implementation NSString(ExtString)

+(void) PrintToConsole:(NSString *)plainText
{
NSLog(@"%@" ,plainText);
}

2、新建一个项目TestA,添加上述文件
在main函数中,添加此头文件,
NSString *test = @"The boy is good";
[NSString PrintToConsole:test];

此项目TestA运行正常,输出The boy is good。

3、新建静态库libUtils,添加ExtString两个文件
编译通过

4、新建一个项目TestB,在Build设置中添加静态库libUtils
同样在main中添加同样的测试代码

现在出现了错误:unrecognized selector sent to XXXXXX

分析:TestA运行正常,TestB出现异常,说明要么TestB没有找到静态库,要么静态库的配置和输出不正确
按项目的文件存在来看,TestB应该找到静态库

由于对扩展方法的使用经验不足,我先建议使用普通类的方式先实现

5、在libUtils,新建两个文件ConsoleObj.h,ConsoleObj.m
@interface ConsoleObj

+(void) PrintToConsole:(NSString *)plainText;

@end

实现:
+(void) PrintToConsole:(NSString *)plainText
{
NSLog(@"%@" ,plainText);
}

在TestB项目中,先屏蔽原有测试,输入新的测试代码:
[ConsoleObj PrintToConsole:@"The second Test code"];

编译成功,运行出现新的错误:
does not implement methodSignatureForSelector: -- trouble ahead

啊,why?

细细想下以前的代码,没有出现问题呀,为什么这次会出现错误?
回溯检查代码ConsoleObj的代码,仅仅发现一个地方和以前不一样,少了父类NSObject,这个差异的产生是由于直接拷贝原来代码ExtString修改而来的。

好,修改此代码
@interface ConsoleObj:NSObject

+(void) PrintToConsole:(NSString *)plainText;

@end

编译libUtils,再运行测试,没有错误了

现在的情况是:
测试项目调试静态库普通类,没有问题【TestB】
测试项目调试项目自带的扩展方法,也没有问题【TestA】
测试项目测试静态库的扩展方法,出现问题unrecognized selector sent to XXXXXX

没有找到问题所在,借用google,baidu
发现网上的方案:在XCode4下,配置编译选项Other Linker Flags,加入-all_load
(PS:-all_load 告知编译器 所有lib都需要加载)


好,按此方案配置TestB,开启原有测试代码,发现OK了

PS,还有点插曲,我实际的项目中静态库又加了系统自带的库,比如libz等
在测试项目中,需要加这些自带库,不然编译通不过。

最后,要提醒的是:
1、Objective-C自建类的超类一定是NSObject,所以不要省略:FatherClass
一定是这样的:
@interface SonClass:FatherClass
@end

2、扩展方法出现错误unrecognized selector sent to,优先考虑-all_load配置,再考虑内存释放

3、用了-all_load,注意原有引用库文件

分享到:
评论

相关推荐

    Objective-C基础教程 中文 PDF 清晰版 [31M]

    Objective-C是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中...

    用Objective-C语言实现了各种设计模式,收集各种例子,方便大家学习和普及设计模式 .zip

    用Objective-C语言实现了各种设计模式,收集各种例子,方便大家学习和普及设计模式。.zip用Objective-C语言实现了各种设计模式,收集各种例子,方便大家学习和普及设计模式。.zip用Objective-C语言实现了各种设计...

    Objective-C基础教程+随书源代码

     Objective-C是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。  本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能...

    Objective-C基础教程(第2版).pdf

    Objective-C是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及其中...

    Objective-C基础教程

    Objective-C是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。 《Objective-C基础教程》适合各类开发人员阅读。 Objective-C是创建Mac OS应用和iPhone应用的主要语言,优雅的面向对象编程环境与C语言特性...

    Objective-C基础教程随书源码

    Objective-C是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。《Objective-C基础教程》结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和...

    提供Swift丰富的扩展和实用工具类,并大多数支持Objective-C .zip

    提供Swift丰富的扩展和实用工具类,并大多数支持Objective-C。.zip提供Swift丰富的扩展和实用工具类,并大多数支持Objective-C。.zip提供Swift丰富的扩展和实用工具类,并大多数支持Objective-C。.zip提供Swift丰富...

    Effective Objective-C 2.0

    《effective objective-c 2.0:编写高质量ios与os x代码的52个有效方法》是世界级c++开发大师scott meyers亲自担当顾问编辑的“effective software development series”系列丛书中的新作,amazon全五星评价。...

    [Objective-c程序设计].杨正洪等.扫描版

    《Objective-C程序设计》(作者杨正洪、郑齐心、李建国)通过大量的实例系统地介绍了Objective-C语言的基本概念、语法规则、框架、类库及开发环境。读者在阅读本书后,可以掌握Objective-C语言的基本内容,并进行...

    Objective-C基础教程源码

    Objective-C是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。《Objective-C基础教程(第2版)》结合理论知识与示例程序,全面而系统地介绍了Objective-C编程的相关内容,包括Objective-C在C的基础上引入的...

    Objective-C基础教程,中文彩色版本.

    Objective-C是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和Cocoa工具包的功能及...

    ### Objective-C的介绍、使用技巧和经典案例

    Objective-C是一种面向对象的编程语言,它是C语言的扩展,同时也是iOS和macOS等苹果操作系统的主要编程语言之一。Objective-C结合了C语言的功能和面向对象编程的特性,具有灵活性强、功能丰富的特点,被广泛应用于...

    Objective-C2.0程序设计

    第1部分 Objective-C语言 第2章 Objective-C程序设计 2.1 编译并运行程序 2.1.1 使用Xcode 2.1.2 使用Terminal 2.2 解释第一个程序 2.3 显示变量的值 2.4 小结 2.5 练习 第3章 类、对象和方法 3.1 到底什么是对象 ...

    Objective-C基础教程(第2版)

    无论你是初次接触Objective-C和Cocoa,还是已有丰富的C语言、C++或者Java编程经验,本书都能让你轻松过渡并熟练掌握Objective-C! 本书三位作者是顶级苹果专家,书中以苹果最新的Xcode 4.x工具为基础,详细讲述了...

    Objective C基础教程(第2版

    Objective-C 是ANSI C的超集,扩展了C 语言使它具备面向对象设计的能力,如类,消息和继承。Objective-C 程序中可以利用现有的C语言代码,使其利用现有的软件架构。这也是为甚莫Objective-C 过去多年间能够成为一种...

    Objective-C培训资料

    Objective-C Objective-C Objective-C Objective-C 培训教程 主要章节提示: 第 一 章 程序整体语法结构 第 二 章 数据类型 第 三 章 字符串 第 四 章 内存管理 第 五 章 对象的初始化 第 六 章 存取器 第 七 章 ...

    Objective-C 基础教程(Amazon超级畅销书)英文版:Learn Objective-C on the Mac (Learn Series)

    中文介绍(china-pub):Objective-C是扩展C的面向对象编程语言,也是iPhone开发用到的主要语言。. 本书结合理论知识与示例程序,全面而系统地讲述Objective-C编程的相关内容,包括Objective-C在C的基础上引入的特性和...

    Objective-C

    Objective-C,简称Obj-C或OC,是一种通用的、面向对象的编程语言,它扩展了标准的ANSI C编程语言,加入了面向对象编程的特性,如类、继承、封装和多态等。Objective-C由Brad Cox和Tom Love在八十年代初期创建,最初...

Global site tag (gtag.js) - Google Analytics