obje-c 中出现给属性赋值后,再去调用属性,属性值结果为空的 BUG,求解答。

2016-03-27 19:21:11 +08:00
 codeisjobs

我在一个类的第一个方法里给属性赋值,出了方法,在另外一个方法调用属性,属性值就为空。 但如果我在第一个方法里最后直接调用另一个方法,属性值又正常,请问什么原因导致的?

这是代码

#import "TSNPopView.h"

typedef void(^completion)();
static completion disCom = ^{};

@interface TSNPopView ()
@property (assign,nonatomic) CGPoint disPoint ;
@end

@implementation TSNPopView

- (IBAction)closeView:(UIButton *)sender {
    NSLog(@"%lf", self.disPoint.x);//这里调用的属性的值在自己手动调用时会为空
    [self disappearToPoint: self.disPoint completion:^{
        disCom();
    }];
    
}


-(void)disappearToPoint:(CGPoint)point completion:(void(^)())completion {
    [UIView animateWithDuration:0.5 animations:^{
        self.center = point;
        self.transform = CGAffineTransformMakeScale(0.01, 0.01);
    } completion:^(BOOL finished) {

        [self removeFromSuperview];
                completion();
    }];
}

-(void)showToPoint:(CGPoint)showPoint disappearToPoint:(CGPoint)disPoint completion:(void(^)())completion{
    TSNPopView * popView = [[NSBundle mainBundle] loadNibNamed:@"TSNPopView" owner:nil options:nil][0];
    popView.center =showPoint;
    [[UIApplication sharedApplication].keyWindow addSubview:popView];
     self.disPoint = disPoint; //给属性赋值
    disCom = completion;
    
    //UIButton * btn= [[UIButton alloc] init];
    //[self closeView:btn];//这里主动调用方法  属性就会赋值正常。
   
}
@end

感觉好崩溃啊,试了好久,好像是所有属性都会出现这种情况,求解答啊。

2169 次点击
所在节点    iDev
3 条回复
xieguobihaha
2016-03-27 20:07:25 +08:00
这是因为 closeView 这个方法,如果按照楼主手动调用的方式,这个对象是从 nib 中加载出来的,而赋值 disPoint 的地方是 self.disPoint = disPoint 。用户点击后进入的对象和赋值的对象不是同一个,而注释掉的部分主动调用是同一个对象,楼主可以试试将赋值的地方变为 popView.disPoint = disPoint;(这样需要把属性的定义移到头文件),再点击就有值了,但是主动调用又没有值了。其实这个问题的关键原因是 nib 加载的对象和实际对象放到同一个类里了,这种方式不推荐,推荐对 TSNPopView 再包装一层。
codeisjobs
2016-03-27 20:37:14 +08:00
@xieguobihaha 感谢回答,我发现问题在哪里了,我在控制器里创建这个 view 的时候调用里面的方法,结果我又在方法里重新创建一次这个 view ,并且把值赋给了控制器创建的对象的属性,然后我做的点击事件的操作实际是方法里面创建的 view 的,读不到属性的值,是我傻逼了,哈哈
xieguobihaha
2016-03-27 21:00:37 +08:00
@codeisjobs 是的,就是这样~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/266685

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX