Как создать переменную экземпляра BOOL в objective c?

мне нужно создать переменную типа BOOL значение по умолчанию False в одном из моих классов Objective-C. Как мне это сделать? Я видел, как люди определяли это по-своему .H файл, но мне действительно не нужно, чтобы эта переменная была общедоступной. Поэтому я не должен класть его в свой .файл м? Кроме того, должен ли я сделать это свойством? Или мне никогда не делать что-то собственностью? Спасибо.

6 ответов


мне нужно создать переменную экземпляра типа BOOL со значением по умолчанию FALSE в одном из моих классов objective C. Как мне это сделать?

предполагая, что вы используете текущий Xcode, вы можете объявить ivar в реализации следующим образом:

@implementation MyClass
{
@private
    BOOL myBool;
}

Я видел, как люди определяют это в своих .H файл, но мне действительно не нужно, чтобы эта переменная была общедоступной.

исторически, вы должны были объявить переменные экземпляра в @interface из-за способа реализации классов. Теперь это необходимо, только если вы нацелены на 32-битную OS X.

кроме того, должен ли я сделать это свойством?

что зависит. Вы обязательно должны сделать его свойством, если он является частью внешнего API вашего класса (для использования несвязанных классов или подклассов. Если это только часть внутреннего состояния объекта, вам не нужно делать его свойством (и я этого не делаю).

или Я когда-нибудь не делал что-то собственностью? Спасибо.

если вы не используете ARC и тип является типом объекта (BOOL-нет), вы всегда должны сделать его свойством, чтобы воспользоваться управлением памятью синтезированных аксессоров. Если ты ... --29-- > are используя ARC, совет в списке разработчиков Apple-сделать материал, который является частью свойств API, и материал, который является внутренним состоянием как ivars.

обратите внимание, что даже для внутреннего состояния вы можете захотеть используйте KVO, в этом случае используйте свойство.

если вы объявляете этот BOOL как свойство и синтезируете его, вам не нужно явно объявлять ivar. Если вы хотите сделать свойство "видимым" только для самого класса, используйте расширение класса

@interface MyClass()

@property (assign) BOOL myBool;

@end

@implementation MyClass

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

@end

обратите внимание, что, хотя компилятор будет выдавать предупреждения для вышеуказанного, во время выполнения любой класс может отправить setMyBool: или myBool на объектах MyClass.


Если вы хотите сделать закрытую переменную, вы можете использовать силу категорий. Сделайте класс MyClass, например ,и в.M файл выполните следующие действия:

#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

BOOL объявляются как iVars с простым BOOL myBool, и как свойство с @property (nonatomic, assign) BOOL myBool. Хотя принять к сведению, логические значения inititalized на нет (ноль). Если вам нужно, чтобы BOOL был доступен из других классов или "глобальный" в файле m, используйте iVar или свойство, иначе просто объявите их как ограниченные vars в отдельном методе.


вы можете поместить объявление в .

делаете ли вы из него свойство, зависит от того, что вы хотите. В качестве свойства вы можете позже применить setter / getter, которые включают проверку / guards / whatever. Кроме того, вы можете применить ключ-значение-доступа.

Если вам это не нужно, нет реальной необходимости в свойстве (но хорошая традиция: вы никогда не знаете, как ваш код будет развиваться).


Если вы сделаете это имущество является публичной. Если вы не хотите, чтобы переменная была общедоступной, не используйте свойство. Почему ты не хочешь быть публичным? Вы можете иметь свойство readonly и сделать запись в вас.m через частную категорию.

Вы можете положить его в свой .M файл, если вы используете iOS 5

@implementation MyClass {
     BOOL _myBool;
}

Я думаю, что это ново для iOS5. Но я тоже видел такой код:

@implementation MyClass {
@private
     BOOL _myBool;
}

надеюсь, что это помогает.


Я использую 0, 1 вместо Да, нет

#define YES 1
#define NO 0