Ios 从函数访问公共属性时会失去值
我对iPhone编程非常陌生,我有一个非常基本的问题,这让我很困惑。我在头文件中声明一个公共UIScrollView,如下所示Ios 从函数访问公共属性时会失去值,ios,iphone,objective-c,Ios,Iphone,Objective C,我对iPhone编程非常陌生,我有一个非常基本的问题,这让我很困惑。我在头文件中声明一个公共UIScrollView,如下所示 @property UIScrollView *scroller; 然后在我的实现文件中综合它 @synthesize scroller; 在 - (id)initWithFrame:(CGRect)frame 方法分配我的对象 if (self) { scroller = [[UIScrollView alloc] initWithFrame:
@property UIScrollView *scroller;
然后在我的实现文件中综合它
@synthesize scroller;
在
- (id)initWithFrame:(CGRect)frame
方法分配我的对象
if (self) {
scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(23, 99, 280, 300)];
}
(该类从UIView扩展)
但当我试图在一个方法中访问这个属性时,我总是得到nil值,这是毫无意义的
- (void)DeselectAll{
scroller.hidden = YES;
}
(滚动条在此始终返回零。)
我还尝试使用self.scroller访问它,但该值仍然为零。我确信我遗漏了一个非常简单的要点,但就是想不出来
(顺便说一句,这个问题发生在我所有的公共财产上)
非常感谢您的帮助
谢谢。首先,按如下方式申报财产
@property(strong,nonatomic) UIScrollView *scroller;
现在初始化为
if (self) {
self.scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(23, 99, 280, 300)];
}
在头文件中创建
UIScrollView
,如下所示:
@interface MyViewController : UIViewController {
UIScrollView * scrollView;
}
@property (nonatomic, retain) IBOutlet UIScrollView * scrollView;
@end
然后在viewDidLoad
中初始化它:
@synthesize scrollView;
- (void)viewDidLoad {
[super viewDidLoad];
self.scrollView = [[UIScrollView alloc]init(WithFrame:)];
[self.scrollView addSubview:...];
self.scrollView.contentSize = ...;
}
如果您使用的是ARC,我认为这些属性正在被释放。 只需在声明时使用强属性
@property(strong, nonatomic)UIScrollView *scroller;
您是否已检查是否正在调用
initWithFrame:
如果您正在NIB文件中创建
UIView
子类,则不会调用该方法,而是调用initWithCoder:
。您的答案是正确的。但您错过了对属性的内存管理。看一看
例如,如果需要保留创建的对象。你应该这样做
对于ARC
@property(strong,nonatomic) UIScrollView *scroller;
用我们的弧线
@property(retain,nonatomic) UIScrollView *scroller;
更新:
您必须使用self
分配它。否则将不会通过setter方法进行设置。如下
if (self) {
self.scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(23, 99, 280, 300)];
}
好的,下面是我解决这个问题的方法。我在nib文件中创建了这些控件,并将变量指定为这些对象的输出。在这种情况下,对象被保留,我可以从我的方法访问它们。(我尝试将变量定义为IBOutlets,但没有分配给nib文件中的控件,在这种情况下,值再次返回为nil。只有在将它们链接到控件后,对象才会保留。)虽然我解决了这个问题,但我很难理解这种行为。我尝试了答案中推荐的所有方法,但奇怪的是,我的方法中的对象一直是零 感谢所有花时间回答我问题的人。也许有人能解释并帮助我理解这种奇怪的行为
干杯。您是否创建了具有
scroller
的类的对象?您是否也创建了任何实例变量?我正在我的类中创建扩展UIView的对象,并在其中初始化它。我使用的不是ivar属性。我放置了一个断点,我可以看到正在调用initWithFrame,并且scroller对象是已初始化。您是否将scroller作为子视图添加到视图中(即添加到您自己),可能在initWithFrame:?[self addSubview:self.scroller]是否可能因为您尚未将scroller添加到视图中,所以ARC以某种方式删除了scroller?我不认为应该,但是……我做了所有这些,但还是得零分。我正在使用ARC。然后将断点放到initWithFrame:
方法。检查是否实际调用了此方法?我认为您正在其他地方指定nil
值。?如果您尝试过以上方法,它应该会起作用。