zoukankan      html  css  js  c++  java
  • iOS常见问题(3)

    一、发现不少人在给成员变量初始化的时候,容易进错一个方法去初始化。

     1 //注意这个方法只有在内存发生警告的时候才会调用。
     2 - (void)didReceiveMemoryWarning
     3 {
     4     [super didReceiveMemoryWarning];
     5     // Dispose of any resources that can be recreated.
     6     
     7 }
     8 
     9 //大部分成员属性的初始化应该在viewDidLoad里面进行。
    10 - (void)viewDidLoad
    11 {
    12     [super viewDidLoad];
    13 }

      最牛解决方法:在一开始就将didReceiveMemoryWarning这个方法删掉。删掉不会影响程序运行。

    二、模拟器问题

      

      当出现这个问题的时候,原因:没有选择模拟器。

      

      解决办法:

    三、对象方法和类方法问题

     1 // 创建视图的工厂方法
     2     + (UIView *)rowViewInitWithicon:(UIImage *)icon shuju:(NSString *)shuju
     3     {
     4         rowView *viewtext = [[NSBundle mainBundle]loadNibNamed:@"rowView" owner:nil options:nil][0];
     5         [viewtext.btntouxiang setBackgroundImage:icon forState:UIControlStateNormal];
     6         viewtext.mingzilablexiao.text = shuju;
     7         
     8         // 重点是这句
     9         //  这是往通知中心添加一条通知 指定通知名称为  back  当观察者self监听到 back 通知是 就调用 callback
    10         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(callback) name:@"back" object:nil];
    11         
    12         /*   以下是报错信息:
    13          +[rowView callback]: unrecognized selector sent to class 0x79d8
    14          2013-11-26 15:31:02.581 lianxirenlianxi[1266:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[rowView callback]: unrecognized selector sent to class 0x79d8'
    15          */
    16         // reason: '+[rowView callback]: 看到报错原因里的+就想到没有实现callback这个类方法。
    17         
    18         // 由于self这个观察者是在类方法中添加的,指的是一个类,所以在调用方法的时候,他会去类方法中找有没有这个方法,不会去对象方法中找。因此我们也应该实现类方法。因此这里的self也只能调用类方法
    19     
    20     // 由于实现的callback为对象方法  所以会报错
    21         //  解决方法  把callback  写成类方法   供观察者调用
    22         return viewtext;
    23     }
    24     //callback方法
    25     - (void)callback
    26     {
    27         NSLog(@"11111111111");
    28     }
    29 //解决方法,将callback 写成类方法 供观察者调用
    30 //callback方法
    31     + (void)callback
    32     {
    33         NSLog(@"11111111111");
    34     }

    四、Xib是用来描述视图长什么样子,一个项目中允许有很多xib,因此我们需要给xib绑定一个标识,即他View中对应的class是谁,就代表描述哪个class。

      

      Xib中owner的class是用来告诉xib中的View需要调用哪个对象的方法,就填谁。比如需要调用dog类中的方法,就填dog。

      

      注意:在连线选择上别连错了,

      步骤一:先考虑自己是想给视图添加控件了还是想给视图添加事件

      步骤二:添加控件就跟xib中的view连线。添加一些事件就给xib中的File’s Owner 连线。

    五、代码顺序问题

     1 [UIView animateWithDuration:0.5 animations:^{
     2         CGRect  tmpFrame = sender.superview.frame;
     3         tmpFrame.origin.x = self.view.frame.size.width;
     4         sender.superview.frame = tmpFrame;
     5         sender.superview.alpha = 0;
     6     } completion:^(BOOL finished) {
     7         int index = [self.view.subviews indexOfObject:sender.superview];
     8         [sender.superview removeFromSuperview];
     9         [UIView animateWithDuration:0.2 animations:^{
    10             for (int i = index; i<self.view.subviews.count; i++)
    11             {
    12                 UIView *chlid = self.view.subviews[i];
    13                 CGRect tmp = chlid.frame;
    14                 tmp.origin.y -=kViewH+1;
    15                 chlid.frame =tmp;
    16             }
    17             
    18         }];
    19         // 在这判断删除按钮是否允许点中,会在动画执行完毕的时候,判断。
    20         _removeIteam.enabled = self.view.subviews.count>1;
    21 
    22     }];
    23      // 而在执行代码块之外,判断删除按钮是否允许点中是不对的,因为动画是在后台运行的,所以在执行动画的时候,就已经执行完判断语句了,而这时最后一个视图还没销毁掉,因此删除按钮永远不会不允许选中,也就不能在判断删除按钮是否允许点中。
    24 // _removeIteam.enabled = self.view.subviews.count>1;

      删完最后一行之后,正确的效果:

      删完最后一行之后,错误的效果。原因,判断的位置放错了:

    六、Xib描述视图的时候,已经固定好描述视图的宽高了,外界调用视图的时候,只需要设置x,y值就好了

      1.出现的问题,创建xib描述的视图时,将宽度设置为一个按钮的宽度了,导致删除按钮不能点击。

      

     1 #pragma mark 添加联系人
     2 - (IBAction)AddPerson:(UIBarButtonItem *)sender {
     3     
     4     NSString *imgName=[NSString stringWithFormat:@"01%d.png",arc4random_uniform(9)];
     5     NSString *labelName = arr[arc4random_uniform(arr.count)];
     6     RowView *rowView = [RowView rowViewWithIcon:imgName name:labelName];
     7     UIView *lastView = [self.view.subviews lastObject];
     8     int nextY = lastView.frame.origin.y + kSpace + kItemHW ;
     9     // 设置rowView的位置和尺寸
    10     CGRect cg =CGRectMake(0, nextY, kItemHW, kItemHW);
    11     rowView.frame=cg;
    12     
    13     [self.view addSubview:rowView];
    14 }

      错误原因:设置rowView的宽度为kItemHW,因此会有以上图片的出现。

       错误会导致删除按钮不能点击,原因:父视图的尺寸不够,即父视图能接收事件的尺寸只有一点点,也就导致超出父视图尺寸的子视图不能监听点击事件。还有一点需要注意,将子视图添加到父视图尺寸之外的位置,只要还在屏幕上就会显示子视图,只不过它不能接收任何事件

      解决方法:

    CGRect cg =CGRectMake(0, nextY,rowView.frame.size.width , kItemHW);

      这样设置就好了,因为xib里面已经设置了rowView的尺寸了,外界不需要更改视图的宽度了,直接获取视图的宽度即可。

      正确效果:

    七、UIToolBar问题

      注意UIToolBar中不能使用viewWithTag这个方法,获取UIToolBar里的子视图。因为UIToolBar里的子视图都是UIBarButtonItem,而UIBarButtonItem是继承NSObject的,因此不能使用viewWithTag获取UIToolBar里的子视图,

      viewWithTag:实现原理

     1 - (UIView *)viewWithTag:(NSInteger)tag
     2 {
     3     
     4   // 1.如果当前tag和当前视图tag相同,直接返回
     5   if (self.tag == tag) return self;
     6    
     7     // 2.如果和当前视图tag不相同,遍历当前视图的所有子控件,查找对应的tag。
     8   for (UIView *view in self.subviews) {
     9    // 3.如果view不是UIView类或者UIView的子类直接返回nil
    10     if (![view isKindOfClass:[UIView class]]) return nil;
    11       if (tag == view.tag) {
    12     //  4. 返回有相匹配的视图
    13             return view;
    14         }
    15     }
    16     // 5.如果都没有找到,返回nil.
    17     return nil;
    18 }

    八、结构体和对象问题

    1 // 这样定义是错的,结构体不是对象,声明变量是不需要加*
    2 CGRect *frame = self.view.frame;
    3 
    4 //结构体变量正确定义:
    5 CGRect frame = self.view.frame;
    6 CGPoint center = self.view.center;
    7 CGSize size = self.view.frame.size;

    九、内存管理问题

      错误打印:

      

      正确打印:

      

      当对象被销毁,一定会调用的方法,可以用这个方法,判断对象在什么时候销毁,用这个调试。

      

      

    十、创建模型的时候,尽量自定义一个工厂方法供外界调用。

      // 工厂方法,简化对象的实例化

    + (id)provinceWithName:(NSString *)name;

      工厂方法好处:简化对象的实例化,快速创建对象。

  • 相关阅读:
    HADOOP security
    apache sentry
    spark-deployment-modes-cluster-or-client
    Hadoop,Spark,Flink 相关KB
    OSGi类加载流程
    why-the-default-authentication-hadoop-is-unsecured ?
    Spring源码情操陶冶-PathMatchingResourcePatternResolver路径资源匹配溶解器
    maven跳过单元测试-maven.test.skip和skipTests的区别
    Maven+eclipse+jetty配置
    分布式事务资料
  • 原文地址:https://www.cnblogs.com/CJDog/p/5113911.html
Copyright © 2011-2022 走看看