Ios 无法从NSObject类访问静态变量,但我可以从UIViewController访问

Ios 无法从NSObject类访问静态变量,但我可以从UIViewController访问,ios,objective-c,constants,Ios,Objective C,Constants,好吧,奇怪的事情发生了,我想答案很简单,但我没能弄清楚到底发生了什么 接下来的情况是: 我有一个名为Constants的NSObject类 常数.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import <GooglePlus/GooglePlus.h> @interface Constants : NSObject +(Constants*)shared; @property

好吧,奇怪的事情发生了,我想答案很简单,但我没能弄清楚到底发生了什么

接下来的情况是:

我有一个名为Constants的NSObject类

常数.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <GooglePlus/GooglePlus.h>

@interface Constants : NSObject

+(Constants*)shared;

@property GTLPlusPerson* googlePlusUser;
@property int profileType;
@property NSString *userName, *userLastName, *userEmail,    *userGoogleId,*userProfilePicture;

@end
我使用这个类来保存我将在整个应用程序中使用的一些静态变量

现在,如果我尝试声明一个变量

[Constants shared].userName = @"name";
从NSObject类方法(我从ViewController调用该方法)中,我无法做到这一点。 但是,如果我直接从ViewController声明常量变量(例如在viewDidLoad之后),一切都正常

这是我试图从中声明变量的类,但我失败了(它也有单例,这可能是问题的根源,但我不确定为什么会这样)

这就是我从我的ViewController调用这些方法的方式:

 - (IBAction)signupWithGoogle:(UIButton *)sender {

//if i call this method here, on button click, it will finish all the steps needed, except setting constant variables
[[GoogleLogin shared] googleLoginFromViewController:self];

//if I uncomment next line, username will be declared and I will be able to access it later
//[Constants shared].userName = @"Petar";

}

有人知道为什么会发生这种情况吗?我应该怎么做才能改变这种情况?

您没有在singleton类上设置属性属性。 比如说,

@property (nonatomic, strong, readonly) ...

您没有在singleton类上设置属性属性。 比如说,

@property (nonatomic, strong, readonly) ...

定义属性时,强烈建议声明要与之一起使用的属性。我想编译器应该用这样的消息来抱怨这个问题

未指定“分配”、“保留”或“复制”属性-“分配”为 假定

因此,请改用以下内容(
copy
semantics适用于可变类)

您还应该指定是以原子方式还是非原子方式访问属性。如果不指定,将应用前者

然后,您使用的是单例模式。建议的方法是像这样使用GCD

+ (ConstantsManager*)sharedManager {

    static ConstantsManager *sharedManager;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedManager = [[[self class] alloc] init];
    });
    return sharedManager;
}

定义属性时,强烈建议声明要与之一起使用的属性。我想编译器应该用这样的消息来抱怨这个问题

未指定“分配”、“保留”或“复制”属性-“分配”为 假定

因此,请改用以下内容(
copy
semantics适用于可变类)

您还应该指定是以原子方式还是非原子方式访问属性。如果不指定,将应用前者

然后,您使用的是单例模式。建议的方法是像这样使用GCD

+ (ConstantsManager*)sharedManager {

    static ConstantsManager *sharedManager;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedManager = [[[self class] alloc] init];
    });
    return sharedManager;
}

您是否尝试过将属性分配移出
completionHandler
?可能是在后台线程上分配了属性,而视图控制器未捕获该分配。检查的一种简单方法是重写setter和getter,并在其中放置断点,以查看访问它们的顺序

1) 删除
@synthesis
,因为它不需要(属性将自动合成为_属性)

2) 覆盖设置器和获取器

-(void)setProfileType:(NSInteger)profileType {
    _profileType = profileType;
}

-(NSInteger)profileType {
    return _profileType;
}
3) 在这些方法中放置断点,并查看getter是否在setter之前被调用。或者,如果只需将分配移出
completionHandler
即可解决此问题,那么您就知道存在一些并发性问题


我建议阅读
原子/非原子
属性、
@synthesis
和Objective-C并发。

您是否尝试过将属性分配移出
completionHandler
?可能是在后台线程上分配了属性,而视图控制器未捕获该分配。检查的一种简单方法是重写setter和getter,并在其中放置断点,以查看访问它们的顺序

1) 删除
@synthesis
,因为它不需要(属性将自动合成为_属性)

2) 覆盖设置器和获取器

-(void)setProfileType:(NSInteger)profileType {
    _profileType = profileType;
}

-(NSInteger)profileType {
    return _profileType;
}
3) 在这些方法中放置断点,并查看getter是否在setter之前被调用。或者,如果只需将分配移出
completionHandler
即可解决此问题,那么您就知道存在一些并发性问题


我建议阅读
原子/非原子
属性、
@synthesis
和Objective-C并发性。

不,这没有帮助。我已经提到,如果我直接从视图控制器设置propreties,这个设置就可以工作,所以它不应该也不会造成任何不同的外观,这是没有帮助的。我已经提到,如果我直接从视图控制器设置propreties,这个设置就可以工作,所以它不应该也不会造成任何不同的外观,这是没有帮助的。我已经提到,如果我直接从视图控制器设置propreties,这个设置就可以工作,所以如果我从GoogleLogin类设置了一些常量变量,例如[Constants shared.userName=@“aaa”,那么它不应该也不会有任何区别稍后尝试从其他ViewController读取该变量,结果为空。但是,如果我从任何ViewController设置了相同的变量,我可以将其设置为正确并稍后读取。尝试使用
copy
并让我知道结果。不,这没有帮助。我已经提到,如果我直接设置propreties,则此设置有效如果我从GoogleLogin类中设置了一些常量变量,例如[Constants shared.userName=@“aaa”,那么它不应该也不会有任何区别稍后尝试从其他ViewController中读取该变量,结果为空。但是,如果我从任何ViewController中设置了相同的变量,我可以将其设置正确并稍后读取。尝试使用
copy
并让我知道结果。