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;

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

  • 相关阅读:
    OK335x mksd.sh hacking
    Qt jsoncpp 对象拷贝、删除、函数调用 demo
    OK335xS 256M 512M nand flash make ubifs hacking
    Qt QScrollArea and layout in code
    JsonCpp Documentation
    Qt 4.8.5 jsoncpp lib
    Oracle数据库生成UUID
    freemarker得到数组的长度
    FreeMarker中if标签内的判断条件
    freemarker语法
  • 原文地址:https://www.cnblogs.com/CJDog/p/5113911.html
Copyright © 2011-2022 走看看