从函数访问时公共属性丢失值

时间:2013-12-19 08:30:31

标签: ios iphone objective-c

我是iPhone编程的新手,我有一个非常基本的问题,这让我很困惑。我在我的头文件中声明了一个公共的UIScrollView。

@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;
}

(滚动条总是在这里返回nil。)

我也尝试使用self.scroller访问它,但值仍为零。我确信我错过了一个非常简单的观点但却无法理解。

(顺便说一下,我的所有公共财产都出现了这个问题)

非常感谢任何帮助。

谢谢。

6 个答案:

答案 0 :(得分:0)

首先,声明属性如下

@property(strong,nonatomic) UIScrollView *scroller;

现在你初始化为

if (self) {
     self.scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(23, 99, 280, 300)];
}

答案 1 :(得分:0)

在头文件中创建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 = ...;
}

答案 2 :(得分:0)

如果您使用ARC,我认为这些属性已经发布。 只需在申报时使用强大的财产。

@property(strong, nonatomic)UIScrollView *scroller;

答案 3 :(得分:0)

您是否检查过正在调用initWithFrame:

如果要在NIB文件中创建UIView子类,则不会调用该方法,而是调用initWithCoder:

答案 4 :(得分:0)

雅你有正确的。但是你错过了对财产的内存管理。看看this

例如,如果您需要保留创建的对象。你应该这样做。

对于ARC,

 @property(strong,nonatomic) UIScrollView *scroller;

withur ARc

@property(retain,nonatomic) UIScrollView *scroller;

更新:

您必须使用self进行分配。否则,它不会通过setter方法设置。如下所示

if (self) {
        self.scroller = [[UIScrollView alloc] initWithFrame:CGRectMake(23, 99, 280, 300)];
}

答案 5 :(得分:0)

好的,这就是我如何解决这个问题。我在我的nib文件中创建了这些控件,并将变量指定为这些对象的出口。在这种情况下,对象将被保留,我可以从我的方法中访问它们。 (我尝试将变量定义为IBOutlets而不分配给nib文件中的控件,在这种情况下,值再次返回为nil。只有在我将它们链接到控件之后,才保留对象。)虽然我解决了这个问题但我遇到了困难理解这种行为。我尝试了答案中推荐的所有内容,但奇怪的是,我的方法中的对象仍然是nil。

感谢所有花时间撰写回复问题的人。也许有人可以解释并帮助我理解这种奇怪的行为?

干杯。