Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从函数访问公共属性时会失去值_Ios_Iphone_Objective C - Fatal编程技术网

Ios 从函数访问公共属性时会失去值

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:

我对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;
}
(滚动条在此始终返回零。)

我还尝试使用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
值。?如果您尝试过以上方法,它应该会起作用。