2014-02-08 41 views
0

我有關於類方法曝光的學術問題。有一些我顯然不明白這一點,希望得到知情人士的澄清。類方法曝光和屬性定義

背景: 我有兩個名爲ViewController和ClassB的類的簡單示例。類B包含一個名爲returnArray的方法。 ViewController訪問數組的數據。我已經暴露了ClassB.h文件中的returnArray方法。

問題: 爲什麼我可以在ViewController中訪問數組的數據而無需定義屬性?我認爲這個屬性會創建一個getter來允許訪問數組。我的例子(只暴露方法)允許我在不創建@property的情況下訪問數據。

類方法:

ClassB.h

@interface ClassB : UIViewController 

+(NSArray *) returnArray; 
//@property (nonatomic, strong) NSArray *returnArray; 

ClassB.m

@implementation ClassB 

+(NSArray *) returnArray 
{ 
    NSArray *locationArray = @[@"Place1", @"Place2"]; 
    return locationArray; 
} 

ViewController.m

- (void)viewDidLoad 
{ 
    NSArray *location = [ClassB returnArray]; 
    NSLog (@"The count of the location is %d", [location count]); 
    NSLog (@"The second item in testArray is %@", location[1]); 
} 

實例方法:查看答案後

ClassB.h 
*/ 
{ 
    @private 
    NSArray *returnArray; 
} 
- (void)setReturnArray:(NSArray*)returnArray; 
-(NSArray *) returnArray; 
*/ 

@property (nonatomic, strong) NSArray *returnArray; 
@end 

ClassB.m - no change 
ViewController.h - no change 
ViewController.m 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //Create instance of ClassB 
    ClassB *classB = [ClassB new]; 

    //Access the instance of returnArray 
    NSArray *location = [classB returnArray]; 

    NSLog (@"The count of the location is %d", [location count]); 
    NSLog (@"The second item in testArray is %@", location[1]); 
} 
+2

我不確定你的問題是什麼。您正在調用返回數組的類方法,並且您正在獲取數組。財產與它有什麼關係?屬性只是類的實例上的getter/setter方法的簡寫。 – jrturton

回答

0

北斗星的回答解決@property和類方法之間的區別,所以這是值得一讀。我的答案假設你知道類和實例方法之間的差異,並着重於創建@property與創建具有關聯setter和getter的實例變量之間的區別。


的原因是因爲returnArray是返回您ClassB一個NSArray對象的公共方法。

A @property僅僅是一個創建三件事物的簡便方法:一個實例變量,一個setter和一個getter。它有允許點語法的額外好處。

但在這一天,點語法拋開結束時,所有你通過聲明@property做的是等效等於這個:

@interface ClassB : NSObject { 
    @private 
    NSArray *returnArray; 
} 

- (void)setReturnArray:(NSArray*)returnArray; 
- (NSArray*)returnArray; 

這是與此相同:

@property NSArray *returnArray; 

當然,除了點語法。

當你這樣做:

NSArray *myArray = classB.returnArray; 

你實際上並沒有直接訪問時,宣佈@property您創建的陣列。

你在做的是調用當你聲明@property時自動生成的getter方法。

+1

即使* dot語法*​​與「* properties」一起使用「正常」,這些概念完全相互獨立。對於類方法,編譯器也將'ClassB.returnArray'轉換爲'[ClassB returnArray]'。 (我見過有人寫'MyClass * obj = MyClass.alloc.init') –

+0

支持Wain和ghgrif。他們一起回答了我的問題。我有兩個我測試過的例子(類和實例)。我的困惑創造的問題是我也暴露了實例方法,所以通常具有相同的結果,無論它是一個類或實例(忽略列舉數組的語法差異)被測試。使用nhgrif的代碼,我能夠確定我已經公開實例方法,並根據其等效代碼測試屬性。現在我有了更好的理解。兩個答案都很有幫助,但是nhgrif的答案稍微完整一些。 –

1

@property是用於創建實例變量和相關聯的訪問器方法(具有定義的訪問/修改標準)的簡寫符號。

你有什麼是方法,它在內部創建一個數組並返回它。

這就是爲什麼您致電[ClassB returnArray];而不是[instanceOfB array];

這些是完全不同的東西。如果你想使用一個屬性,那麼你需要創建一個ClassB的實例,然後訪問該屬性。假設該數組是在創建ClassB的實例時創建的,這將工作。