2013-10-17 53 views
-1

新手到目標C ...目標C - 從公共職能訪問私有變種

注意:這是一個概念性的問題,因爲我想翻譯「公共和私人」從我瞭解的其他語言。

如何通過「public」方法訪問「stringB」ivar?

myClass.h

@interface myClass : UIViewController { 

} 

@property (nonatomic, retain) NSString *stringA; 
@property (nonatomic, retain) NSString *stringB; 

- (void)dealWithStringA; 
+ (void)dealWithStringB; 

myClass.m

#import "myClass.h" 

@interface myClass() { 

} 
@end 

@implementation myClass 

// My "private" function 
- (void)dealWithStringA 
{ 
    return _stringA; 
} 

// My "public" function 
+ (void)dealWithStringB 
{ 
    // Errors with: Instance variable "stringB" accessed in class method 
    return _stringB; 
} 
+0

感謝Grzegorz,你清除了我的想法....只是試圖根據我從其他語言瞭解的情況掌握一些信息。 – bob

回答

1

你在理解「+」,「 - 」 - 這不是關於私人/公共。

有你應該實現在您.m文件私有函數:

@interface YourClass() 
- (id) privateMethod; 
@end 

一切你在.h文件中聲明將被公開:

@interface YourClass : NSObject 
- (id)someMethod //public 
@end 

「+」用於靜態函數,所以你可以在沒有類的實例的情況下調用它們。 例如你的情況:

[myClass dealWithStringB]; 

和「 - 」功能,你需要實例。

[[[myClass alloc] init] dealWithStringA]; 

靜態函數可以用來當你沒有從一個類或者他們相當經常被用來創建類的實例需要的任何屬性。

1

的 「+」 是指前綴類方法,不是公開的。一個「 - 」代表方法,而不是私有的。

公有和私有方法都可以訪問類或實例的私有狀態。

2

+開頭的方法稱爲目標C中的類方法,其中以-開頭的方法是實例方法。實例方法只能在該類的實例上執行。

此外,您的方法的返回類型將爲NSString,因爲您期望從該方法獲取字符串對象。

對於類方法,您需要創建該類的自動釋放實例,然後對該實例執行操作。

例如,

+ (NSString*)dealWithStringB 
{ 
    MyClass *myClass = [[[MyClass alloc] init] autorelease]; 
    myClass.stringB = @"Its String B";//It's an absurd example 
    return myClass.stringB; 
} 
0

myClass.h(類似於你)

@interface myClass : UIViewController 
    { 

    } 

@property (nonatomic, retain) NSString *stringA; 
@property (nonatomic, retain) NSString *stringB; 

- (void)dealWithStringA; 
+ (void)dealWithStringB; 

@end 

myClass.m

@implementation myClass 
@synthesize stringA ; 
@synthesize stringB ; 

static myClass* instance = nil; 
+(void) dealWithStringB 
    { 
     if(instance==nil) 
     { 
      instance=[myClass alloc]init]; 
     } 

     else 
     { 
      //Access the field this way 
        printf("@"The string content is %@",instance.stringB); 
     } 

    } 

希望其清除!