2012-05-21 191 views
12

我需要在我的Objective-C類之一的False默認值創建BOOL類型的實例變量。我該怎麼做呢?我已經看到人們在他們的.h文件中定義它,但我並不需要這個變量是公開的。因此,我不應該把它放在我的.m文件中?另外,我應該讓它成爲一個物業嗎?或者我應該永遠不要製造某種財產?謝謝。如何在目標c中創建一個BOOL實例變量?

+0

嘗試:' - (無效)viewDidLoad中{ BOOL標誌= NO; ''。另外,一旦你想聲明.m文件,你不能從.m文件中進行屬性合成。 –

+0

我應該在哪裏定義'flag'?在.m文件中沒有意義嗎?但是,我無法弄清楚它的語法。 Thx – Nosrettap

+0

在.h類中定義屬性,就像在.h中所做的那樣。它將使該類對於不能從外部訪問的類非常私密。 – iphonic

回答

21

我需要在我的一個目標c類中創建一個類型爲BOOL的實例變量,其默認值爲FALSE。我該怎麼做呢?

@implementation MyClass 
{ 
@private 
    BOOL myBool; 
} 

我見過的人把它定義在他們的.h文件,但我不」:

假設你正在使用當前的Xcode,你可以在這樣的實施申報伊娃真的需要這個變量是公開的。

從歷史上看,由於類的實現方式,您必須在@interface中聲明實例變量。現在只有當您的目標是32位OS X時纔有必要。

此外,我應該讓它成爲一個屬性嗎?

這取決於。如果它是你的類的外部API的一部分(對於不相關的類或子類可以使用,那麼你應該明確地將它作爲屬性)如果它只是對象內部狀態的一部分,則不需要將它作爲屬性(並且我不' T)。

或者我應該永遠不會讓什麼屬性?謝謝。

如果你不使用ARC和類型爲對象類型(BOOL是不是),你應該總是使它如果你使用ARC,你的,Apple開發人員列表中的建議是製作屬於API屬性的內容以及作爲ivars的內部狀態。

請注意,即使對於內部狀態,您可能也想使用KVO,在這種情況下,請使用屬性。

如果將此BOOL聲明爲屬性併合成它,則不需要顯式聲明伊娃。如果你想使財產「可見」只類本身,使用類擴展

@interface MyClass() 

@property (assign) BOOL myBool; 

@end 

@implementation MyClass 

@synthesize myBool = myBool_; // creates an ivar myBool_ to back the property myBool. 

@end 

需要注意的是,儘管編譯器會產生警告,針對上述情況,在運行時,任何類都可以發送setMyBool:myBoolMyClass的對象。

0

如果你使它成爲一個財產,它是公開的。如果你不想讓變量公開,那麼不要使用屬性。你爲什麼不想公開?您可以擁有隻讀屬性,並通過私有類別在您的.m中進行寫入。

你可以把它放到你的.m文件,如果使用的iOS 5

@implementation MyClass { 
    BOOL _myBool; 
} 

我覺得這是一個新的iOS5。但我也看過這樣的代碼:

@implementation MyClass { 
@private 
    BOOL _myBool; 
} 

希望這會有所幫助。

+0

「如果你把它變成財產,它就是公開的。」其實,沒有。屬性可以在類擴展或類別中私下聲明。 – jlehr

+0

但是如果你什麼都不做,他們是公開的。 – Pfitz

+0

如果你什麼都不做,你什麼都沒有。什麼決定一個方法或一個屬性是否公開就是它的聲明。如果它在標題中聲明,它是公開可見的;否則它不是。 (雖然沒有運行時執行。) – jlehr

2

BOOL的聲明爲iVars,簡單的BOOL myBool,以及作爲@property (nonatomic, assign) BOOL myBool的財產。但請注意,BOOLean值初始化爲NO(零)。如果需要可以從其他類訪問BOOL,或者在m文件中使用「全局」,請使用iVar或屬性,否則只需在單獨的方法中將它們聲明爲範圍變量。

+0

BOOL ivars初始化爲YES?你想重新思考這個說法嗎? – jrturton

+0

你相信嗎?自動更正? – CodaFi

11

如果你想製作一個私有變量,你可以使用類別的力量。 作出榜樣,在.m文件類MyClass的執行以下操作:

#import "MyClass.h" 

@interface MyClass() //This is an empty category on MyClass class 

@property (nonatomic, assign) BOOL myBool; 

@end 


@implementation MyClass 

@synthesize myBool = _myBool; 

-(void)myMethod { 
    self.myBool = YES; //this is using the property 
    _myBool = NO; //this is the instance variable, as @synthesize creates an instance variable for you 
    // both are private 
} 

@end 
1

你可以把聲明中.m文件。

無論你製作一個屬性,取決於你想要的。 作爲一個財產,你可以在以後申請包括檢查/守衛/任何的setter/getter。 另外,您可以應用鍵值訪問。

如果你不需要其中的一個,那麼就不需要一個屬性(但是一個好傳統:你永遠不知道,你的代碼將如何演化)。

0

我使用0,1代替YES,NO

#define YES 1 
#define NO 0