从不同的类访问类变量

时间:2015-07-07 08:07:22

标签: ios objective-c xcode scope

一个非常常见的通用问题,但似乎每个人都有自己对访问属于另一个类的变量的看法。我想要的是在class2中使用布尔变量来执行语句。我想要的例子是:

<?xml version="1.0" encoding="UTF-8" ?>
<settings>
  <profiles>
    <profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>gpg</gpg.executable>
        <gpg.keyname>A1234567</gpg.keyname>
      </properties>
    </profile>
  </profiles>
  <servers>
    <server>
      <id>A1234567</id>
      <passphrase>{pQ...lV}</passphrase>
    </server>
  </servers>
</settings>

if语句是class2似乎不起作用,因为我试图在class2中打印boolean值,它返回的所有值都是false。我想得到class1布尔变量的当前值,并在第2类中使用它而不进行初始化。

1 个答案:

答案 0 :(得分:2)

查看您的问题,您似乎想要创建&#39; Class1&#39;在另一个类中,获取要在那里显示的属性值。

在这种情况下,无论何时实例化&#39; Class1&#39;,它都会带有初始值。这意味着价值将是&#39; null&#39;当然。如果您想获得更改后的值,则需要创建&#39; Class1&#39;作为Singleton类,其中,此类将在整个应用程序中实例化一次。意思是改变&#39; boolean1&#39;的价值。在任何一个班级中,无论何时何地,都可以在另一个班级中获得相同的价值。

但同样,这完全取决于你想要如何使用整个事物。

Singleton示例:

// Class1.h
@interface Class1 : NSObject

/**
 *  A boolean property
 */
@property (nonatomic, strong) BOOL *boolean;


// Class1.m
@implementation Class1

// This is actual initialisation of the class instance.
+ (Class1 *)sharedInstance {
    static Class1 *sharedInstance = nil; //static property, so that it can hold the changed value
    // Check if the class instance is nil.
    if (!sharedInstance) {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            // If nil, create the instance, using dispatch_once, so that this instance never be created again. So, if needed, app will use the existing instance.
            sharedInstance = [[super allocWithZone:NULL] init];
            // custom initialisation if needed

        });
    }
    return sharedInstance;
}

// So that, if somebody uses alloc and init, a new instance not created always.
// Rather use existing instance
+ (id)allocWithZone:(NSZone *)zone {
    return [self sharedInstance];
}

// So that, if somebody uses alloc and init, a new instance not created always.
// Rather use existing instance
- (id)copyWithZone:(NSZone *)zone {
    return self;
}

@end

现在更新并使用该值。

//Class2.m

#import "Class1.h"

Class1 *myinstance = [[Class1 alloc] init];
myinstance.boolean = YES;

获取另一个类的值

//Class3.m

#import "Class1.h"

Class1 *myinstance = [[Class1 alloc] init];
if(myinstance.boolean == YES){
    Do Something
}