在ObjC中使用私有方法

简介: 面向对象的设计中,有一个特性封装性,就是将某些东西包装和隐藏起来,让外界无法直接使用,只能通过某些特定的方式才能访问。在Objective-C中也可以做到这一点。

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

在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才能编译成功,编译成功后运行可以得到上述结果。

目录
相关文章
C# 继承类中(父类与子类)构造函数的调用顺序
C# 继承类中(父类与子类)构造函数的调用顺序
|
2月前
|
JavaScript 前端开发 开发者
|
2月前
|
JavaScript 前端开发 开发者
创建一个私有变量和私有方法的闭包
【10月更文挑战第26天】可以在JavaScript中创建具有私有变量和私有方法的闭包,实现数据的封装和隐藏,提高代码的可维护性和安全性。不同的方式适用于不同的场景,开发者可以根据具体的需求选择合适的方法来创建闭包。
|
8月前
|
编译器
static关键字修饰成员变量与成员函数
1. static概念 声明 为static的类成员称为类的静态成员,用static修饰的成员变量,称为静态成员变量;用static修饰的成员函数,称为静态成员函数,都存放在堆区。 静态成员变量一定要在类外进行初始化。
141 0
|
编译器 定位技术
在父类的构造函数中调用虚函数为什么不能实现多态
在父类的构造函数中调用虚函数为什么不能实现多态
118 0
|
存储 编译器 C语言
【三、类中的静态成员】静态成员变量与静态成员函数(static关键字、this指针)
【三、类中的静态成员】静态成员变量与静态成员函数(static关键字、this指针)
165 0
|
存储 编译器 iOS开发
iOS - isa、superclass指针,元类superclass指向基类本身(下)
本文已同步至掘金:iOS - isa、superclass指针,元类superclass指向基类本身
iOS - isa、superclass指针,元类superclass指向基类本身(下)
|
iOS开发
iOS - isa、superclass指针,元类superclass指向基类本身(上)
本文已同步至掘金:iOS - isa、superclass指针,元类superclass指向基类本身
iOS - isa、superclass指针,元类superclass指向基类本身(上)
|
Android开发
【错误记录】反射内部类报错 ( Android 使用 Hook 时反射内部类报错 )
【错误记录】反射内部类报错 ( Android 使用 Hook 时反射内部类报错 )
157 0
【错误记录】反射内部类报错 ( Android 使用 Hook 时反射内部类报错 )