Ios 无法从NSObject类访问静态变量,但我可以从UIViewController访问
好吧,奇怪的事情发生了,我想答案很简单,但我没能弄清楚到底发生了什么 接下来的情况是: 我有一个名为Constants的NSObject类 常数.hIos 无法从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
#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
并让我知道结果。