`
zyallday
  • 浏览: 26146 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Obj-C中如何实现私有方法

阅读更多
博客来源:http://blog.csdn.net/zhangao0086/article/details/6675436

面向对象的设计中,有一个特性封装性,就是将某些东西包装和隐藏起来,让外界无法直接使用,只能通过某些特定的方式才能访问。

在Objective-C中也可以做到这一点。

比如下面这个类:

先是接口:

// =========================== 
// = File: SomeClass.h 
// = Interface for SomeClass 
// =========================== 
 
@interface SomeClass : NSObject 
 
-(void) msg; 
+(void) classMsg;  
 
@end 

很简单的接口,再是它的实现和类别:
// =========================== 
// = File: SomeClass.m 
// =========================== 
#import "SomeClass.h" 
 
// ================================= 
// = Interface for hidden methods 
// ================================= 
@interface SomeClass (hidden) 
 
+(void) hiddenClassMethod; 
-(void) hiddenInstanceMethod;  
 
@end 
 
// ===================================== 
// = Implementation of hidden methods 
// ===================================== 
@implementation SomeClass (hidden) 
 
+(void) hiddenClassMethod 

    printf( "Hidden class method.\n" ); 

 
-(void) hiddenInstanceMethod 

    printf( "Hidden instance method\n" ); 

 
@end 
 
// ================================ 
// = Implementation for SomeClass 
// ================================ 
@implementation SomeClass 
 
-(void) msg 

    printf("Inside msg()...\n"); 
     
    [self hiddenInstanceMethod]; 
    [SomeClass hiddenClassMethod]; 

 
+(void) classMsg 

    printf("Inside classMsg()...\n"); 

 
@end 

有一个hidden的类别,在SomeClass的实现中调用了hidden的两个方法。

只包含SomeClass.h文件的main:

// 
//  main.m 
//  Private Method 
// 
//  Created by mac on 11-8-10. 
//  Copyright 2011年 __MyCompanyName__. All rights reserved. 
// 
 
#import <Foundation/Foundation.h> 
#import "SomeClass.h" 
 
int main (int argc, const char * argv[]) 

    SomeClass *ptr = [[SomeClass alloc] init]; 
     
    // Display message (including messages from hidden methods) 
    [ptr msg]; 
     
    // Call a class method 
    [SomeClass classMsg]; 
     
    // Compile warning (can't access hidden instance method) 
    //  [ptr hiddenInstanceMethod]; 
     
    // Compile warning (can't access hidden class method) 
    //  [SomeClass hiddenClassMethod];   
    [ptr release]; 
 
    return 0; 


运行成功后应该可看到如下的显示:
Inside msg()...

Hidden instance method

Hidden class method.

Inside classMsg()...


内部调用hidden的两个方法是没问题的。在main的return之前有四行注释,把其中两行发送消息的注释取消,再编译后可能会遇到两种情况:

1.有警告,但是编译成功,直接运行后可以得到如下结果:

Inside msg()...

Hidden instance method

Hidden class method.

Inside classMsg()...

Hidden instance method

Hidden class method.

方法确实隐藏的(从警告中可以得知),但是可以连接到。
2.编译失败,Xcode4.2版本的编译器好像默认是Apple LLVM compiler 3.0,需要切换成LLVM GCC 4.2才能编译成功,编译成功后运行可以得到上述结果。
分享到:
评论

相关推荐

    小型售货机

    protected://与私有成员性质相似,唯一的差异表现在派生类中 int Goodnum; //定义货物编号 int Innum; //定义库存 float Buyp; //定义进价 float Sellp; //定义卖价 public: virtual void Set_Goodnum(int num)...

    新版Android开发教程.rar

    NTT DoCoMo, Inc. 日本多科莫电信 SOFTBANK MOBILE Corp. 日本软银移动 Sprint Nextel( 美国 ) T-Mobile( 德国 ) Telecom Italia( 意大利 ) Telef ó nica( 西班牙 ) Vodafone 沃达丰电信 China Unicom 中国联通 ...

    纯c语言实现面向对象分析与示例分享

    封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的...

    易语言程序免安装版下载

    “在库中的对应命令名”请务必准确填写静态库中公开导出的符号名称(C函数(cdecl)编译后,符号名称通常是在函数名称前加下划线(_));“在库中的对应命令名”以@开头表示以cdecl方式调用,否则表示以默认的stdcall...

    【05-面向对象(下)】

    函数式接口中被实现方法的全部参数传给该类方法作为参数。 (a,b,...) -&gt; 类名.类方法(a,b, ...) 引用特定对象的实例方法 特定对象::实例方法 函数式接口中被实现方法的全部参数传给该方法作为参数。 (a,b, ...)...

    java 面试题 总结

    声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其...

    超级有影响力霸气的Java面试题大全文档

     声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,...

    Java开发技术大全(500个源代码).

    invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法示例 localVariable.java 演示局部变量 localVSmember.java 局部变量与成员变量同名...

    C++复习资料之系列

    在一个C++程序中,main函数的位置( c )。 (a) 必须在程序的开头 (b) 必须在程序的后面 ( c ) 可以在程序的任何地方 (d) 必须在其它函数中间 2.用C++语言编制的源程序要变为目标程序必须要经过( d )。 (a) ...

    Java 虚拟机面试题全面解析(干货)

    如果出现在方法体中,则上述代码会反映到Java栈的本地变量表中,作为 reference类型数 据出现。 new Object( 反映到Java堆中,形成一块存储了 bject类型所有对象实例数据值的内存。Java堆中还包 含对象类型数据的地址...

    Java学习题答案

    abstract和non-static的 17 接口可以声明成final 18 内部类可以访问外层类的任何变量,包括私有的 19 匿名类可以有构造器,声明时候不能带参数 20 抽象方法可以是static的。 21 构造器没有任何返回类型...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

Global site tag (gtag.js) - Google Analytics