2010-03-03 38 views

回答

1

嚴格來講,你不能在Objective-C中創建私有方法;但是您可以在包含實現(MyClass.m)的文件中創建一個類別,將其從頭文件(MyClass.h)中隱藏。

//MyClass.h  
#import <Foundation/Foundation.h> 

@interface MyClass : NSObject { 

} 

@end 

實現文件:

//MyClass.m 

@interface MyClass() 

- (void)myPrivateMethod; 

@end 

@implementation MyClass 

- (void)myPrivateMethod { 
    return; 
} 

@end 
1

的Objective-C不支持私有方法的原生設計。

但是,您可以通過使用「類擴展」(匿名類別)來實現私有方法控制。

基本的想法是在你的類的實現文件(不是它的頭文件)中聲明一個你的私有方法的類擴展,但是在你的@implementation塊之外。然後,您可以實施這些方法,並且任何外部課程都無法看到它們。就像這樣:

@interface MyClass() 
    - (void)myPrivateMethod; 
@end 

@implementation MyClass 
    - (void)myPrivateMethod 
    { 
     //implementation goes here 
    } 

    -(void)someOtherMethod 
    { 
     [self myPrivateMethod]; 
    } 
@end 

使用類擴展勢力你實現在主@implementation塊的方法,並要求其執行(很像,好像他們在標題的主要@interface塊被宣佈) 。不幸的是,由於Objective-C的動態特性,這實際上並不會阻止這些方法被其他類調用。他們會得到一個警告,告訴他們該類可能不會對消息作出響應,但是在運行時會起作用。這給你的唯一的東西是能夠隱藏其他程序員的方法。

+1

匿名類被稱爲*類擴展*。不同之處在於在主實現塊中必須聲明一個方法__。正常類別_可以單獨使用,在主要實現塊中甚至根本不需要。 – 2010-03-03 11:45:49

+0

我已更正答案。謝謝。 – Jasarien 2010-03-03 12:12:59

3

Objective-C中沒有私有方法的概念。但是,您可以執行的操作是在頭文件中提供方法,並在私有文件中添加類別。

這通常是上下這樣的:

@interface MyObject : NSObject { 
    // ivars 
} 
// public methods 
@end 

// usually in a seperate file 
@interface MyObject() 
// private methods 
@end 

一個類別的一個空的名字意味着它是一個class extension,這告訴主執行塊所需的方法編譯器。

0

你不能。只有實例變量可以被標記爲私有。

雖然有辦法做一些等同於私人方法的東西。 一般的想法是,你不要在你的頭文件中聲明私有方法,而是在你的實現文件中聲明私有方法。

因此,如果你想有一個公共的(myPublicMethod)和私人(myPrivateMethod)方法,你是頭看起來是這樣的:

@interface MyClass { 
} 
- (void)myPublicMethod; 
@end 

然後,你還要爲你實現三個選項文件:

不要聲明該方法在任何@interface部分,只是確保它的實現它在@implementation部分在使用之前。

@implementation MyClass 

- (void)myPrivateMethod { } 

- (void)myPublicMethod { 
    [self myPrivateMethod]; 
} 

@end 

2.

在使用您的實現文件中聲明私有方法,並在主@implementation塊實現他們的匿名類。

@interface MyClass() 
- (void)myPrivateMethod; 
@end 

@implementation MyClass 

- (void)myPrivateMethod { } 

- (void)myPublicMethod { 
    [self myPrivateMethod]; 
} 

@end 

使用您的實現文件常規類別和實施在一個單獨的@implementation塊中的私有方法。

@interface MyClass (PrivateMethods) 
- (void)myPrivateMethod; 
@end 

@implementation MyClass (PrivateMethods) 

- (void)myPrivateMethod { } 

@end 

@implementation MyClass 

- (void)myPublicMethod { 
    [self myPrivateMethod]; 
} 

@end 
+0

每種方法的優點/缺點都很好。 – 2010-03-03 16:08:21

相關問題