V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
codeisjobs
V2EX  ›  iDev

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

  •  
  •   codeisjobs · 2016-03-27 19:21:11 +08:00 · 2311 次点击
    这是一个创建于 3168 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    这是代码

    #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
    

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

    3 条回复    2016-03-27 21:00:37 +08:00
    xieguobihaha
        1
    xieguobihaha  
       2016-03-27 20:07:25 +08:00
    这是因为 closeView 这个方法,如果按照楼主手动调用的方式,这个对象是从 nib 中加载出来的,而赋值 disPoint 的地方是 self.disPoint = disPoint 。用户点击后进入的对象和赋值的对象不是同一个,而注释掉的部分主动调用是同一个对象,楼主可以试试将赋值的地方变为 popView.disPoint = disPoint;(这样需要把属性的定义移到头文件),再点击就有值了,但是主动调用又没有值了。其实这个问题的关键原因是 nib 加载的对象和实际对象放到同一个类里了,这种方式不推荐,推荐对 TSNPopView 再包装一层。
    codeisjobs
        2
    codeisjobs  
    OP
       2016-03-27 20:37:14 +08:00 via iPhone
    @xieguobihaha 感谢回答,我发现问题在哪里了,我在控制器里创建这个 view 的时候调用里面的方法,结果我又在方法里重新创建一次这个 view ,并且把值赋给了控制器创建的对象的属性,然后我做的点击事件的操作实际是方法里面创建的 view 的,读不到属性的值,是我傻逼了,哈哈
    xieguobihaha
        3
    xieguobihaha  
       2016-03-27 21:00:37 +08:00
    @codeisjobs 是的,就是这样~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5918 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:00 · PVG 10:00 · LAX 18:00 · JFK 21:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.