• 经验点滴


    bash

    转换16进制的方法:echo ‘ibase=10;obase=16;801312852′|bc

    1. 1.把UIView 转换成图片  
    2. -(UIImage *)getImageFromView:(UIView *)view{  
    3. UIGraphicsBeginImageContext(view.bounds.size);  
    4. [view.layer renderInContext:UIGraphicsGetCurrentContext()];  
    5. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  
    6. UIGraphicsEndImageContext();  
    7. return image;  
    8. }  

    2. 获取指定时间与现在时间的差,转换成  天:时:分:秒

    +(NSString *) compareCurrentTime:(NSString *) compareDateString

    {

        NSString *comStr=[compareDateString substringToIndex:compareDateString.length-2];

        NSDateFormatter *df=[[NSDateFormatter alloc]init];

        [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

        NSDate *compareDate=[df dateFromString:comStr];

        NSTimeInterval  timeInterval = [compareDate timeIntervalSinceNow];

        NSMutableString *result=[[NSMutableString  alloc]initWithString:@"剩余 "];

        div_t h = div(timeInterval, 3600);

        int hour = h.quot;

        div_t m = div(h.rem, 60);

        int min = m.quot;

        int sec=m.rem;

        if (hour>24) {

            div_t d=div(hour,24);

            int day=d.quot;

            NSString *dayString=[NSString stringWithFormat:@"%d天",day];

            [result appendString:dayString];

            return  result;

        }else if (hour>0&&hour<24) {

            NSString *hourString=hour>=10?[NSString stringWithFormat:@"%d:",hour]:[NSString stringWithFormat:@"0%d:",hour];

            [result appendString:hourString];

        }else{

            [result appendString:@"00:"];

        }

        if (min>0) {

            NSString *minString=min>=10?[NSString stringWithFormat:@"%d:",min]:[NSString stringWithFormat:@"0%d:",min];

            [result appendString:minString];

        }else{

            [result appendString:@"00:"];

        }

        if (sec>0) {

            NSString *secString=sec>=10?[NSString stringWithFormat:@"%d",sec]:[NSString stringWithFormat:@"0%d",sec];

            [result appendString:secString];

        }else{

            [result appendString:@"00"];

        }

        return  result;

    }

    3.设置键盘上的工具栏

            UITextField *textfield=[[UITextField alloc]init];

            UIView *view=[[UIView alloc]init];

            textfield.inputAccessoryView=view;

    4.ios模拟器中文输入:

        Xcode菜单项 --> Product --> Scheme --> Edit Scheme -->  Run --> Option --> Application Region 设置为 “中国”

    自动化添加注释 <#name#>

    5.日历类

         NSCalendar * calendar = [NSCalendar currentCalendar];

        根据日期截取相应的时间段

         NSDateComponents *components = [calendar components:NSCalendarUnitSecond|NSCalendarUnitMinute|NSCalendarUnitHour 

    fromDate:[NSDate date]];

        CGFloat hour = components.hour;

        CGFloat minute = components.minute;

        CGFloat second = components.second;

        

        秒的角度

         CGFloat secondAngle = second * 6;

        秒的弧度

         CGFloat secondRadian = kRadian(secondAngle);

        分钟的弧度

         CGFloat minuteRadian = kRadian(minute * 6);

        小时的弧度

         CGFloat hourRadian = kRadian(hour * 30);

        /*

         每分钟,

            时针增加的度数是360/12/60 = 0.5度 

            转动的弧度kRadian(0.5)   

            所以根据当前分钟数时针转动的弧度数就是 kRadian(minute * 0.5)

         */

        hourRadian += kRadian(minute * 0.5);

        _secondLayer.transform = CATransform3DMakeRotation(secondRadian, 0, 0, 1);

        _minuteLayer.transform = CATransform3DMakeRotation(minuteRadian, 0, 0, 1);

        _hourLayer.transform = CATransform3DMakeRotation(hourRadian, 0, 0, 1);

    6.模拟网络请求 模态罩

     UIActivityIndicatorView *aiv = [[UIActivityIndicatorView alloc]

    initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];

        UIView *coreView = [[UIView alloc]initWithFrame:self.bounds];

        coreView.backgroundColor = [UIColor blackColor];

        coreView.alpha = 0.0f;

        [self addSubview:coreView];

        [UIView animateWithDuration:0.5f  animations:^{

            coreView.alpha = 0.5f;

            [self.aiv startAnimating];

            NSURLConnection *conn = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:20.0f] delegate:self];

            [conn start];

        } completion:^(BOOL finished) {

            [UIView animateWithDuration:0.5 delay:1 options:UIViewAnimationOptionCurveLinear animations:^{

                coreView.alpha = 0.0;

            } completion:^(BOOL finished) {

                [self.aiv stopAnimating];

                [coreView removeFromSuperview];

            }];

        }];

    7.拉伸图片

    方法一:iOS中有个叫端盖(end cap)

    + (UIImage *)resizeImage:(UIImage *)image

    {

        CGFloat w = image.size.width;

        CGFloat h = image.size.height;

        return [image stretchableImageWithLeftCapWidth:w / 2 topCapHeight:h / 2];

    }

    1. // width为图片宽度  
    2. rightCapWidth = width - leftCapWidth - 1;   
    3. // height为图片高度  
    4. bottomCapHeight = height - topCapHeight - 1  

    经过计算,你会发现中间的可拉伸区域只有1x1

    1.这个方法在iOS 5.0出来后就过期了

    2.这个方法只能拉伸1x1的区域

    方法二:(ios5)

    - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets 

    方法一:(ios6)

    + (UIImage *)resizableImageWithName:(NSString *)imageName

    {

        // 加载原有图片

        UIImage *norImage = [UIImage imageNamed:imageName];

        // 获取原有图片的宽高的一半()

        CGFloat w = norImage.size.width * 0.5;

        CGFloat h = norImage.size.height * 0.5;

        // 生成可以拉伸指定位置的图片

        UIImage *newImage = [norImage resizableImageWithCapInsets:UIEdgeInsetsMake(h, w, h, w) resizingMode:UIImageResizingModeStretch];

        return newImage;

    }

    • UIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域来填充图片
    • UIImageResizingModeTile:平铺模式,通过重复显示UIEdgeInsets指定的矩形区域来填充图片

    8.计算文本占用的宽高

    /**

     *  计算文本占用的宽高

     *

     *  @param str     计算的文本

     *  @param font    字体

     *  @param maxSize 文本最大的size

     *

     *  @return

     */

    + (CGSize)sizeWithString:(NSString *)str font:(UIFont *)font maxSize:(CGSize)maxSize

    {

    if (iOS_VERSION_NOT_LESS_THAN_7) {//IOS7之后

         NSDictionary *dict = @{NSFontAttributeName:font};

         CGSize textSize = [str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin 

    attributes:dict context:nil].size;

            return textSize;

        }

        CGSize textSize = [text sizeWithFont:font

                           constrainedToSize:CGSizeMake(maxWidth, MAXFLOAT)

                               lineBreakMode:NSLineBreakByCharWrapping];

        return textSize;

    }

    9.获取应用版本号

      //获取应用的版本号

        NSDictionary *infoDict = [NSBundle mainBundle].infoDictionary;

        //1.infoDict[(NSString *)kCFBundleVersionKey]; 2.infoDict[@"CFBundleVersion"]

        NSString *currntVersion = infoDict[@"CFBundleVersion"];

    10.导航栏遮盖了UITableView

    1、方法一 

             self.edgesForExtendedLayout = UIRectEdgeNone;

    压入桟的控制器frame的y值就是从导航条下面开始

             self.automaticallyAdjustsScrollViewInsets = YES;

              self.extendedLayoutIncludesOpaqueBars = YES;

    2、方法二translucent(半透明)

    self.navigationController.navigationBar.translucent = NO;

    3、方法三

    self.extendedLayoutIncludesOpaqueBars = NO;

    4、方法四 若用到tableview

    self.automaticallyAdjustsScrollViewInsets = YES;

    实际内部改变了了scrollView 的 contentInsets

    11.图片循环轮播

    1.不复用的话就是有几个图片就建几个imageView

    原理: 4-1-2-3-4-1 count = 4 +2

    初始位置: scrollView.contentOffset.x = CGPointMake(LFScreenW, 0);

    if (scrollView.contentOffset.x == (_photos.count + 1) * LFScreenW) {//最后一张即 ‘1’,

             scrollView.contentOffset =  CGPointMake(LFScreenW, 0);//视觉上感觉不到,突然转到第一个‘1’

         }

        if (scrollView.contentOffset.x == 0) {//当移动到第一个4的时候

              scrollView.contentOffset = CGPointMake(_photos.count * LFScreenW,0); 转到第二个‘4’

         }

    12.  关联 objc_setAssociatedObject(动态运行时添加实例变量或者属性)/与分类的区别就是可以添加实例变量

      #import <objc/runtime.h>头文件

         objc_setAssociatedObject需要四个参数:源对象,关键字,关联的对象和一个关联策略。

         

        1 源对象alert

        2 关键字 唯一静态变量key associatedkey

        3 关联的对象 sender

        4 关键策略

      OBJC_ASSOCIATION_ASSIGN

       enum {

    OBJC_ASSOCIATION_ASSIGN = 0,           若引用/**< Specifies a weak reference to the associated object. */

            OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1, /**< Specifies a strong reference to the associated object.  The association is not made atomically. */

            OBJC_ASSOCIATION_COPY_NONATOMIC = 3,   /**< Specifies that the associated object is copied.   The association is not made atomically. */

           OBJC_ASSOCIATION_RETAIN = 01401,       /**< Specifies a strong reference to the associated object.   The association is made atomically. */

             OBJC_ASSOCIATION_COPY = 01403          /**< Specifies that the associated object is copied.   The association is made atomically. */

         };

        objc_setAssociatedObject(alert, @"static", message,OBJC_ASSOCIATION_ASSIGN);

       把alert和message字符串关联起来,作为alertview的一部分,关键词就是static,

    之后可以使用objc_getAssociatedObject从alertview中获取到所关联的对象,便可以访问message

          即实现了关联传值

         objc_setAssociatedObject(alert, @"btn property",sender,OBJC_ASSOCIATION_ASSIGN);

    }

    ————————————————————————————————————————————————————————————————————————————————

    关联

        关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。

        关联特性只有在Mac OS X V10.6以及以后的版本上才是可用的。

    在类的定义之外为类增加额外的存储空间

         使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候或者是考虑到二进制兼容性的时候是非常有用。

         关联是基于关键字的,因此,我们可以为任何对象增加任意多的关联,每个都使用不同的关键字即可。

    关联是可以保证被关联的对象在关联对象的整个生命周期都是可用的(在垃圾自动回收环境下也不会导致资源不可回收)。

    创建关联

         创建关联要使用到Objective-C的运行时函数:objc_setAssociatedObject来把一个对象与另外一个对象进行关联。

    该函数需要四个参数:源对象,关键字,关联的对象和一个关联策略。

       ■  关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。

       ■  关联策略表明了相关的对象是通过赋值,保留引用还是复制的方式进行关联的;

         还有这种关联是原子的还是非原子的。这里的关联策略和声明属性时的很类似。

         这种关联策略是通过使用预先定义好的常量来表示的。      

      1. static char overviewKey;  

    1. NSArray * array =[[NSArray alloc] initWidthObjects:@"One", @"Two", @"Three", nil];  
    2. //为了演示的目的,这里使用initWithFormat:来确保字符串可以被销毁  
    3. NSString * overview = [[NSString alloc] initWithFormat:@"@",@"First three numbers"];  
    4. objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);  
    5. [overview release];  
    6. //(1) overview仍然是可用的  
    7. [array release];  
    8. //(2)overview 不可用  

        在(1)处,字符串overview仍然是可用的,这是因为OBJC_ASSOCIATION_RETAIN策略指明了数组要保有相关的对象。当数组array被销毁的时候,也就是在(2)处overview也就会被释放,因此而被销毁。如果此时还想使用overview,例如想通过log来输出overview的值,则会出现运行时异常。

    获取相关联的对象

         使用Objective-C函数objc_getAssociatedObject。

    1. NSString * associatedObject = (NSString *)objc_getAssociatedObject(array, &oveviewKey);  

    断开关联

        断开关联是使用objc_setAssociatedObject函数,传入nil值即可。

    1. objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);  

       其中,被关联的对象为nil,此时关联策略也就无关紧要了。

        

    使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。

    只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。

    14.使用initWithFormat:来确保字符串可以被销毁 

    15.CFObject和NSObject转换(ARC不能管理Core Foundation Object的生命周期)

    __bridge只做类型转换,但是不修改对象(内存)管理权;

    __bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,

    同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象;

    __bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。

    16.

    实现自释放的方法可以总结为以下三种方式

    动态属性的自释放

    @property 的自释放

    swizzling dealloc的自释放

    17.

    声明属性:strong,weak, unsafe_unretained

    声明临时变量:__strong,  __weak, __unsafe_unretained,  __autoreleasing

      unsafe_unretained 类似于weak 不会增加引用,但是它是不安全的,它不会在对象内存被释放的情况下将指针做为nil ,而是crash 掉,也就是所谓的野指针。

    自己理解:指针的空间释放了后,都要将指针赋为NULL(nil). 在这儿用weak关键字会自动做这一步,而unsafe_unretained不会去做任何动作。(类似与变量内存监听)

    __autoreleasing则可以使对像延迟释放

    这样即便在函数内部申请的空间,在函数外部也可以使用,同样也适合谁分配谁释放的原则。

    18 .

    UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews

    layoutSubviews方法调用先于drawRect

    layoutIfNeeded遍历的不是superview链,应该是subviews链

    iphone device的刷新频率是60hz,也就是1/60秒后重绘 

    19.

    -ObjC 这个flag告诉链接器把库中定义的Objective-C类和Category都加载进来。

    这样编译之后的app会变大(因为加载了其他的objc代码进来)。

    但是如果静态库中有类和category的话只有加入这个flag才行。

      -all_load 这个flag是专门处理-ObjC的一个bug.

    20.

    static变量是不允许添加__block标记的

    Block_copy(blk);复制block后,block所持有的内存区会被拷贝至堆上

    没有__block标记的变量,其值会被复制一份到block私有内存区

      有__block标记的变量,其地址会被记录在block私有内存区

    我们使用clang的rewrite-objc命令来获取转码后的代码。

    1.对全局区的block调用copy,会返回原指针,并且这期间不处理任何东西(至少目前的内部实现是这样);

    2.对栈上的block调用copy,每次会返回新复制到堆上的block的指针,同时,所有__block变量都会被复制至堆一份(多次拷贝,只会生成一份)。

    3.对已经位于heap上的block,再次调用copy,只会增加block的引用计数。

     objc类实例方法中的block如果被复制至heap,那么当前实例会被增加引用计数,当这个block被释放时,此实例会被减少引用计数。

    但如果这个block没有使用当前实例的任何成员,那么当前实例不会被增加引用计数。

    小结:

    当我们创建一个block,并调用之,编译器为我们做的事情如下:

    1.创建block所有的部件代码:一个主体,一个真正的执行代码函数,一个描述信息(可能包含两个辅助函数)。

    2.将我们的创建代码转码为block_impl的构造语句。

    3.将我们的执行语句转码为对block的执行函数的调用

    我们无法直接创建堆上的block,堆上的block需要从stack block拷贝得来

    栈block复制得来的新block,其isa指针会被赋值为_NSConcreteMallocBlock

    在栈上创建的block,其isa指针是_NSConcreteStackBlock。

    在全局区创建的block,其比较类似,其构造函数会将isa指针赋值为_NSConcreteGlobalBlock。

    21 系统安全,唐巧的博客

    你知道吗?中国的越狱团队还会向苹果上报漏洞,蒸米说这是为了 Reputation,一般是把手里多得觉得不太好用的漏洞报出去,你就可以想像这个封闭系统的质量了

    那这个事情就无解了吗?我想很可能是的,我们能做的,就是尽量提高安全意识,尽量小心,毕竟黑客也是会考虑性价比,挑软柿子欺负。最后蒸米向我推荐了 fireeye 的攻击检测网址,上面可以看到全球正在发生的黑客攻击行为 https://www.fireeye.com/cyber-map/threat-map.html ,我想这可能就是现实吧。

    开发中要做到安全性,代码混淆,加壳处理

  • 相关阅读:
    【转载自酷壳】编程能力与编程年龄
    xcode中的nslog数据格式
    xcode 的 pch 预编译头文件
    获取App的Documents路径
    使用gdb调试app
    收集的一些OC知识点
    收集到的几篇看雪学院文章
    【转】iOS平台的应用程序调试与分析
    前端技术开发的一些建议
    UIImage的两种加载方式
  • 原文地址:https://www.cnblogs.com/guaishushu/p/4979089.html
Copyright © 2020-2023  润新知