2010-09-02 82 views
2

我有以下條件:如何訪問Objective C中的公共實例變量?

@interface MyClass:NSObject 
    @public NSString *str; 
@end 

@implementation 
-(id)init{ 

} 

@end 

現在我想訪問其他類str變量外MyClass的,(1)使用MyClass的對象(2)不使用MyClass的對象,我怎麼能做到這一點?

回答

1

可以調用使用此:

MyClass *a; 
a.str; 

沒有對象,你不能叫一個實例變量。然而

[MyClass doX]; 

,讓公共實例變量是不是一個好的做法:然後

@interface MyClass:NSObject 

+ (void)doX; 

@end 

@implementation 

+ (void)doX { 
    // do whatever 
} 

在另一個類,你只需要調用:但是,你可以調用靜態方法本聲明。原因是它會讓任何類,方法在沒有你控制的情況下改變那個實例變量。例如,他們可以將NSString * str設置爲零,然後任何人都不能調用任何東西,或者他們在調用時可能會忘記執行內存管理。

公共變量更好的做法是使用@property

例如,您的字符串應該聲明如下:

@property (nonatomic, retain) NSString * str; 

,然後在執行:

@implementation MyClass 

@synthesize str; 

好事關於屬性是編譯器會爲你生成gettter和setter方法,這些設置器會爲你正確處理內存。

更多properties here

0

嘆了口氣,我知道這個帖子是死多頭,但我相信以上回答不正確。 以及第一位。

請參閱下面的鏈接。 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocObjectsClasses.html#//apple_ref/doc/uid/TP30001163-CH11-SW1

對於上述接口工作,你需要聲明中使用的屬性及其 類之外,因爲實例變量是不是它的類外可見。

好;你不需要。做類似MyClass-> str的是有效的。

請看這個例子

@interface Foo : NSObject { 

@public NSInteger publicMember; 
@private NSInteger aproperty; 

} 
@property (assign) NSInteger aproperty;` 

然後調用類

Foo *f = [Foo new]; 
f.aproperty = 90; 
//f.publicMember = 100; property 'publicMember' not found of type Foo * 
f->publicMember = 100; 

但正如上面的帖子說,你應該總是使用@properties因爲如果公共變種是一個字符串,你是不是以任何方式保留字符串。