iOS一些笔记

笔记

0、pch 的全称是precompiled Headers

叫做预编译头文件的意思。

1、unsupported devices deal

我的mac复制不灵敏

有时候们发现一个问题,连接手机设备,提示,unsupported devices

问题很可能是我们在设置设备时只限定了一个设备,比如ipad.

我们可以去那个general里面Development info --->device修改

 

2、鼠标按住文件,然后我们按住command键,我们可以找到文件的目录

 

3、下面部分是转载自:http://www.jianshu.com/p/90184c718b11

空指针,野指针,僵尸对象

(1)、僵尸对象,已经被销毁的对象(不能再使用的对象)。

(2)、野指针 指向僵尸对象(不可用内存)的指针 给野指针发信息会报EXC_BAD_ACCESS的错误变(这跟nil还不一样,nil对应的指针是有地址的,而僵尸对象或者说僵尸指针是没有的,根本不存在这个东西,这是我的理解)。

(3)、空指针 没有指向内存储空间的指针(里面存的是nil,也就是0),给空指针发信息时没有任何反应的。

(4)、为了避免指针错误的常见方法:对象被销毁之后,将指向对象的指针变为空指针。

4、文件大小的计算封装

- (CGFloat )fileSizeByMCalcalation:(CGFloat )fileLength {

         return  (CGFloat)imageData.length/(1024 *1024);

}

 

5、用instusment工具首先要退出来,pingfangsc ,sc是简体中文

6、sizetofit  

如果我们什么都没有设置,它会首先设置为零,x = 0,y = 0,文字的高为20

size会定义好宽高,但是没有定义x,y这个你自己要处理,如果事先设置了frame,我们事后的x,y会是固定的,size.width和size.height不会变

[label sizeToFit];

label.y = labelY;

label.centerX = cameraBtn.centerX;

sizetofit放在前面

7、

@property (strong, nonatomic) IBOutlet UIImageView *imageView;

上面一句话相当于下面三句话,做事时要注意

 

 

 

@property (strong, nonatomic) UIImageView *imageView;

 

self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(kscreenWidth/2-125, kscreenHeight/2-125,250, 250)];

    [self.view addSubview:self.imageView];

8、

 换掉textfied键盘的右侧❎的图片

UIButton *clearButton = [self valueForKey:@"_clearButton"];

        [clearButton setImage:[UIImage imageNamed:@"图片名"] forState:UIControlStateNormal]

- (CGRect)clearButtonRectForBounds:(CGRect)bounds {

    CGRect originalRect = [super clearButtonRectForBounds:bounds];

    return CGRectOffset(originalRect, -18, 0);

}

 

//添加键盘线条

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth([UIScreen mainScreen].bounds), 1.0 / [UIScreen mainScreen].scale)];

    separatorView.backgroundColor = [UIColor lightGrayColor];

    textField.inputAccessoryView = separatorView;

    return YES;

}

// 获取WiFi信息

- (id)getSSIDInfo {

      NSArray *arr = (__bridge_transfer NSArray *)CNCopySupppotedInterfaces();

      NSDictionary *info;

      for (NSString *object in arr){

         info = (__bridge_transfer NSDictionary *)CNCopyCurrentNetworkInfo((__bridge CFStringRef)object);

         if(info && [info count]){

           label.text = info[@"SSID"];

           break;

     }

   }
}

9、xml和json 小比较

 

xml 数状结构

json键值对

请求体,包含json,是协议的内容之一

 

心跳机制判断状态

客户端要是在线,我们就可以发请求,一旦不发了我们就可以断定断线了

 

包:包含两个链接端的信息,例如id,信息,内容,大部分情况下就是一段xml或者json .

10、单例理解

static MutipleUserManagerment *userManagerment = nil;

@implementation MutipleUserManagerment

+ (MutipleUserManagerment *)shareManager

{

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        if(!userManagerment)

            userManagerment=[[MutipleUserManagerment alloc]init];

            userManagerment.checkedUserListDic = [NSMutableDictionary dictionaryWithCapacity:1];

    });

    return userManagerment;

}

 

(1)、单例顾名思义是只有一个实例,怎么做到的呢,首先声明一个全局的静态变量userManagerment,然后再调用方法,如果有就返回实例,没有的话就自行创建一个,因为这是全局性的,当创建好了,就可以被检索到,不要重新再进行创建。

(2)、dispatch_once_t这个是函数GCD里面的一个方法,这样做的目的是为了确保线程安全,当多个线程一起调用这个方法时,要确保一个线程结束了才再调用这个方法。

11、长按信息编辑

 

- (NSArray *)menusItems:(NIMMessage *)message

{

    NSMutableArray *items = [NSMutableArray array];

    if (message.messageType == NIMMessageTypeText) {

        [items addObject:[[UIMenuItem alloc] initWithTitle:@"复制"

                                                    action:@selector(copyText:)]];

    }

    [items addObject:[[UIMenuItem alloc] initWithTitle:@"删除"

                                                action:@selector(deleteMsg:)]];

    return items;

   }

长按信息编辑

12、#import与@class的区别

1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。

2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。

3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。

4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。

所以,一般来说,@class是放在interface中的,只是为了在interface中引用这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明的类进来.

13、压缩图片方法

 

- (UIImage*)OriginImage:(UIImage *)image scaleToSize:(CGSize)size {

    UIGraphicsBeginImageContext(size); //你所需要的图片尺寸

    [image drawInRect:CGRectMake(0,0, size.width, size.height)];

    UIImage* scaledImage =UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return scaledImage;  //返回已变图片

}

14、

if ([[NSUserDefaultsstandardUserDefaults] objectForKey:akey] ) {

     NSMutableArray  *mutableArr= [[[NSUserDefaultsstandardUserDefaults] objectForKey:akey]mutableCopy];

 }

首先要进行非空判断,然后进行mutaleCopy

[NSUserDefaultsstandardUserDefaults] objectForKey得到的都是不可变的

还有,有mutableCopy,前面的mutableArr无需进行初始化。

15、几个概念

 

比如你需要一个30pt*30pt的图标,那么这时你就需要跟美工(美术工程师)要三个文件:

一个是30px*30px的PNG图片,用原名来命名即可,例如sample.png。

一个是60px*60px的PNG图片,这个要用原名@2x来命名,例如sample@2x.png。

一个是90px*90px的PNG图片,这个要用原名@3x来命名,例如sample@3x.png。

这样把这三张图片导入进工程,你会神奇地发现,这三个文件居然会被iOS统一识别为sample.png,用的时候只需要[UIImage imageNamed:@"sample"]就行了。

那么讲一下应用场景。

1x的图标用于1:1的屏幕,非视网膜屏,例如iPhone 3GS、(/*20140414DEL*/ //早期iPhone 4、感谢@池谷湧指正)非视网膜屏的众多iPad等。

2x的图标用于1:2的屏幕,大部分视网膜屏,机型如(/*20140414ADD*/ iPhone 4、)iPhone 4S、iPhone 5、iPhone 5s、iPhone 6、iPad with Retina及后续的视网膜屏iPad等。

3x的图标目前应用于1:3的屏幕,即iPhone 6Plus,这个就比较特殊了,因为苹果为了方便开发者,想出来一个简便的实现方案,将2208*1242分辨率的图像压缩输出在1920*1080的屏幕上。

 

像素:英文名叫px

 

像素是构成图像最基本的点,平时说的像素多少也就是这些点的多少。而分辨率就是构成图像的点的排列方式。比如说一张照片的分辨率1600*1200,就表示这个照片上一共有1600*1200=192万个像素,每个横道有1600个像素,每个竖道有1200个像素

 

分辨率

说手机分辨率是1334×750代表,纵向有1334像素,横向有750像素

Retina
来源《百度百科》

 

所谓“Retina”是一种显示技术,可以将把更多的像素点压缩至一块屏幕里,从而达到更高的分辨率并提高屏幕显示的细腻程度。由摩托罗拉公司研发。最初该技术是用于Moto Aura上。这种分辨率在正常观看距离下足以使人肉眼无法分辨其中的单独像素。也被称为视网膜显示屏。

其中

 

计算公式

 a代表人眼视角,h代表像素间距,d代表肉眼与屏幕的距离。符合以上条件的屏幕可以使肉眼看不见单个物理像素点。这样的IPS屏幕就可被苹果称作“Retina显示屏”。将通常使用距离代入上公式可知:行动电话显示器的像素密度达到或高于300ppi就不会再出现颗粒感;手持平板类电器显示器的像素密度达到或高于260ppi就不会再出现颗粒感

SSL和TLS

来源<百度百科>

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

16、iOS数据存储的指导方针,继续完善

 

  /AppName.app   应用程序本身包目录

  /Documents/       应用程序的重要数据文件和用户数据文件等都放在这个目录, iTunes进行备份和恢复时,这个目录会被复制。

   /Library/Preferences   存放app的偏好设置文件,使用NSUserDefaults类产生的文件

  /Library/Caches   用于存放app使用过程中产生的支持文件和缓存文件, 还有日志文件也最好放在这个目录。 iTunes不会备份这个目录文件。

   /tmp/    用于存放临时文件,不会被备份, 而且系统可能清理这个目录

17、1、求字符串的高度

+ (CGFloat)textHeight:(NSString *)text fontInt:(NSInteger)fontInt labelWidth:(CGFloat)labelWidth
{
    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:text];
    
    NSRange allRange = [text rangeOfString:text];
    [attrStr addAttribute:NSFontAttributeName
                    value:[UIFont systemFontOfSize:fontInt]
                    range:allRange];
    [attrStr addAttribute:NSForegroundColorAttributeName
                    value:[UIColor blackColor]
                    range:allRange];
    
    NSRange destRange = [text rangeOfString:text];
    [attrStr addAttribute:NSForegroundColorAttributeName
                    value:[UIColor redColor]
                    range:destRange];
    
    CGFloat titleHeight;
    NSStringDrawingOptions options =  NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
    CGRect rect = [attrStr boundingRectWithSize:CGSizeMake(labelWidth, CGFLOAT_MAX)
                                        options:options
                                        context:nil];
    titleHeight = ceilf(rect.size.height);
//    return titleHeight + 2;  // 加两个像素,防止emoji被切掉.
    return titleHeight;
}

18、pch文件的建立

 


简单概括:首先是建立一个pch文件

 

然后搜索这个文件夹,设置两项,其中一项是yes,另一项是地址,找到地址我们可以选择文件所在地,然后拖到终端里面找到地址。

19、错误类型的处理
遇到这个错误,

先看网上的一个说法:

地址:http://blog.csdn.net/chenyong05314/article/details/24414063

 

当我们利用xcode连接真机进行开发的时候,编译运行到真机上的时候,编译成功,在copy file to device的途中突然遇到An unknown error occurred.这样的错误。

发好的包安装不上机器等。
 
如果仅仅提示“An unknown error occurred.”而没有其他任何废话(Se* th* instal* lo* fo* mor* detai*s.)的话。那么极有可能的情况就是你的机器内存满了,没有剩余空间来安装接下来这个应用。
 

这个方法在我那里行不通,或许在有些情况是成立的,我是通过退出xcode,然后重新打开,有时候我们忘记了其实我们的编译工具xcode也是一个软件,它也很可能出错,我们需要考虑到它的因素。

20、钥匙串访问

 

找到证书和私钥

 

点击私钥

修改

21、钥匙串的一个设置小技巧,可以很快的锁定屏幕

 


 

 

 

 
22 定制导航栏的好文章
23、

UIEdgeInsetsMake的使用

如果有大于零的数字,优先使用数字,不发生冲突情况下,图片不变形

如果大于零的数字有冲突,那么他自己就自己权衡一下,图片可能会变形

24、几种环境

开发环境:开发环境是程序猿们专门用于开发的服务器,配置可以比较随意, 为了开发调试方便,一般打开全部错误报告。
测试环境:一般是克隆一份生产环境的配置,一个程序在测试环境工作不正常,那么肯定不能把它发布到生产机上。
生产环境:是值正式提供对外服务的,一般会关掉错误报告,打开错误日志。
三个环境也可以说是系统开发的三个阶段:开发->测试->上线,其中生产环境也就是通常说的真实环境。

25、滑动视图只有在其内容区才显示,contentOffset 内容视图的起点到滑动视图的起点。

26、use_frameworks! 在swift里面用pod时要用上这个词。

target 'MySample' do 
pod 'AFNetworking', '~> 2.5'
pod 'Net', '~> 0.2' //This is a sample in Swift
use_frameworks! // 
end

27、swift转过来的类等同于系统的类(使用在oc中),颜色会跟系统的类的颜色一致。

28、点击要打开的文件,右击———打开方式——选择这个rar软件——自然就会打开。

29、获取手机app的默认文件

30、Scale to fill ,Aspect Fit ,Aspect Fill

Aspect fill :在保持长宽比的前提下,缩放图片,使图片充满容器。

Aspect fit :在保持图片的长宽比的前提下,缩放图片,是的图片在容器内完整的显示出来。

Scale to fill:缩放图片,使得图片充满容器,图片未必保持长宽比协调,有可能会拉伸至于变形。

31、如果不能自动搜索,我们应该怎么做。

Went to XCode > Preferences > Components > Documentation.去这列下载

32、相对路径实际就是调用当前目录下面的文件,绝对路径跟相对路径一样调用文件,但绝对路径是一个固定地址。相对路径即相当于当前工程文件的路径,‘./’表示当前工程文件夹,后面接得全部是真实的文件名,“../”表示上层目录,在xcode里“¥(PROJECT_DIR)”也表示当前工程文件夹目录。$(SRCROOT)代表的是项目根目录下,$(PROJECT_DIR)代表的是当前工程文件夹目录,也就是整个项目。一般实际开发中,都是用相对路径,除非是自己做项目,项目位置不变动。否则代码就是相对路径,这样就不会害怕项目的位置变动了或者发给别人开发。

33、the defference between keywindow and window

They are the same in iOS, but on Mac OS they can be different, because in iOS there is only one window, while on Mac OS could be more than one. 

通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow

34、get rootviewcontroller

 

- (UIViewController*) getTopMostViewController

{

    UIWindow *window = [[UIApplicationsharedApplication]keyWindow];

    if (window.windowLevel !=UIWindowLevelNormal) {

       NSArray *windows = [[UIApplicationsharedApplication]windows];

       for(windowin windows) {

            if (window.windowLevel ==UIWindowLevelNormal) {

               break;

            }

        }

    }

    

   for (UIView *subViewin [windowsubviews])

    {

       UIResponder *responder = [subViewnextResponder];

        

       //added this block of code for iOS 8 which puts a UITransitionView in between the UIWindow and the UILayoutContainerView

       if ([responderisEqual:window])

        {

           //this is a UITransitionView

           if ([[subViewsubviews]count])

            {

               UIView *subSubView = [subViewsubviews][0];//this should be the UILayoutContainerView

                responder = [subSubViewnextResponder];

            }

        }

        

       if([responderisKindOfClass:[UIViewControllerclass]]) {

           return [selftopViewController: (UIViewController *) responder];

        }

    }

    

   returnnil;

}

 

- (UIViewController *) topViewController: (UIViewController *) controller

{

   BOOL isPresenting =NO;

   do {

       // this path is called only on iOS 6+, so -presentedViewController is fine here.

       UIViewController *presented = [controllerpresentedViewController];

        isPresenting = presented !=nil;

       if(presented !=nil) {

            controller = presented;

        }

    }while (isPresenting);

   return controller;

}

35、@class 优点,能解决a import b,然后b import a的问题,缺点,不能访问内部属性和变量。

36、#define widthjjj ([UIScreen mainScreen].bounds.size.width -60)定义宏要打括号,否则会出现你意想不到的问题

37、有时候app上不了网,找了很久都找不到问题,问题很可能是你的手机设置了代理。

38、在iOS中一个代理可以有多个委托方,而一个委托方也可以有多个代理,DNS是域名系统。

39、协议只能定义公用的一套接口,类似于一个约束代理双方的作用。但不能提供具体的实现方法,实现方法需要代理对象去实现。协议可以继承其他协议,并且可以继承多个协议,在iOS中对象是不支持多继承的,而协议可以多继承

 

// 当前协议继承了三个协议,这样其他三个协议中的方法列表都会被继承过来@protocol LoginProtocol <UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate>- (void)userLoginWithUsername:(NSString *)username password:(NSString *)password;@end <转自刘小壮 http://www.jianshu.com/p/2113ffe54b30>
40、NSDictionary *dic = [NSDictionarydictionaryWithObjectsAndKeys:[UIFontsystemFontOfSize:14],NSFontAttributeName,[UIColorredColor],NSForegroundColorAttributeName,nil];
要注意object在前
NSDictionary *dic = @{NSFontAttributeName:[UIFontsystemFontOfSize:14],NSForegroundColorAttributeName:[UIColorredColor]}
键在前
41、

- (void)prepareForReuse{

    [superprepareForReuse];

   //解决加载cell闪动的问题

}

42、NSDictionary *dic =nil;

    NSLog(@"print dic %@",dic[@"ddddd"]);

这么写不会崩溃,可以对nil发消息。

43、如何打印body

#ifdef  DEBUG

        NSLog(@"DEBUG LOG: post req url: %@, body: %@", operation.request.URL.absoluteString, [[NSString alloc]initWithData:operation.request.HTTPBody encoding:4]);

#endif

 

NSLog(@"%@", [addressUrl stringByAppendingFormat:@"?%@", [paramString stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"&"]]]);

 

2017-09-26 18:04:54.163 appname [2753:836684] paramString == &phone=182109999999&phoneid=1F9C0AC1-E4C3-4A36-8747-0A2BFDFB5ACB&devicetype=1

2017-09-26 18:04:54.163appname [2753:836684] addressUrl == http://****/api/****/user/*****

2017-09-26 18:05:33.294appname [2753:836684] http://*****/api/****/user/check_user?phone=18210606268&phoneid=1F9C0AC1-E4C3-4A36-8747-0A2BFDFB5ACB&devicetype=1

(lldb) 

 

44、CGRect rect =CGRectInset(view.frame,dx,dy);

新来的rect是在view.frame上偏移dx和dy,宽度和高度偏移2 * dx,2 * dy

CGRect rect  =CGRectOffset(CGRect rect,CGFloat dx,CGFloat dy)

这个移动这么多距离,但是新来的框架的宽高不变

45、string ----float wrong can save 5 presicon

- (NSString *)separatedDigitStringWithNum:(double )number {

    NSNumberFormatter *numberFormatter = [[NSNumberFormatteralloc]init];

    [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];

    [numberFormatter setMaximumFractionDigits:2];

    [numberFormatter setRoundingMode:NSNumberFormatterRoundHalfUp];

    NSNumber *num = [NSNumbernumberWithDouble:number];

    NSString *numberAsString = [numberFormatterstringFromNumber:num];

    return numberAsString;

}

46、属性未赋值self.property 为空,声明属性但是未赋值,这个属性的实例变量为空

47、isKindOfClass ,isMemberOfClass和isSubclassOfClass  比较

 NSString *str = @"Person";

   Class cls =NSClassFromString(str);

    if ([clsisSubclassOfClass:Person.class]) {

        NSLog(@"yes,yes");

    }

 

    if ([clsisKindOfClass:Person.class]) {

        NSLog(@"yes,yes");

    }

 

    Person *peron = [[Personalloc]init];

    if ([peronisKindOfClass:Person.class]) {

        NSLog(@"yes,yes");

    }

isKindOfClass和isSubclassOfClass 被判断的A是参数B的同类或者子类都行。

但是第一个方法是实例方法,被判断的A必须是实例的对象,第二个方法被判断的A必须是类。

因此上面第一项打印yes,yes,第二项就不会,第三项会。

isMemberOfClass 要求严格,必须被判断的A必须跟B同名。

48、研究计算方法boundingRectWithSize

 CGRect size = [strboundingRectWithSize:CGSizeMake(10,CGFLOAT_MAX)options:NSStringDrawingUsesLineFragmentOrigin |NSStringDrawingUsesFontLeadingattributes:@{NSFontAttributeName :[UIFontsystemFontOfSize:14],

这个方法CGSizeMake(10, CGFLOAT_MAX),如果实际的超过10,就换行,如果不超过,就返回最小值。

49 、如何鉴别手机型号

  • A1865 - iPhone X
  • A1901 - iPhone X
  • A1864 - iPhone 8 Plus
  • A1897 - iPhone 8 Plus
  • A1863 - iPhone 8
  • A1905 - iPhone 8
  • A1661 - iPhone 7 Plus
  • A1784 - iPhone 7 Plus
  • A1785 - iPhone 7 Plus
  • A1786 - iPhone 7 Plus
  • A1660 - iPhone 7
  • A1778 - iPhone 7
  • A1779 - iPhone 7
  • A1780 - iPhone 7
  • A1662 - iPhone SE
  • A1723 - iPhone SE
  • A1724 - iPhone SE
  • A1634 - iPhone 6S Plus
  • A1687 - iPhone 6S Plus
  • A1690 - iPhone 6S Plus
  • A1699 - iPhone 6S Plus
  • A1633 - iPhone 6S
  • A1688 - iPhone 6S
  • A1691 - iPhone 6S
  • A1700 - iPhone 6S
  • A1522 - iPhone 6 Plus
  • A1524 - iPhone 6 Plus
  • A1593 - iPhone 6 Plus
  • A1549 - iPhone 6
  • A1586 - iPhone 6
  • A1589 - iPhone 6
  • A1453 - iPhone 5s
  • A1457 - iPhone 5s
  • A1518 - iPhone 5s
  • A1528 - iPhone 5s
  • A1530 - iPhone 5s
  • A1533 - iPhone 5s
  • A1456 - iPhone 5c
  • A1507 - iPhone 5c
  • A1516 - iPhone 5c
  • A1526 - iPhone 5c
  • A1529 - iPhone 5c
  • A1532 - iPhone 5c
  • A1428 - iPhone 5
  • A1429 - iPhone 5
  • A1442 - iPhone 5
  • A1387 - iPhone 4S
  • A1431 - iPhone 4S
  • A1332 - iPhone 4
  • A1349 - iPhone 4
  • A1303 - iPhone 3GS
  • A1325 - iPhone 3GS
  • A1241 - iPhone 3G
  • A1324 - iPhone 3G
  • A1203 - iPhone   
50、用userdefault保存mutableDic取出来会变异(变成不可变),但是用归档接档保存的mutableDic不会变异(变成不可变)
51、用Button时,如果用setimage放置图片,那么这个图片的frame跟button 本身的frame不一样.如果要想保持图片跟设计图大小,两种方法:用imageView,加手势;用uibutton 的setbackground方法也行。
52、for 循环,给一个label赋值,只会显示最后一个值,不会展示那个变化的效果,如果要想展示,可以尝试在每次赋值时放到一个特定的线程上,就行。

54、判断取出字典时不能messageDic[@"share_url”],要添加判断,如果messageDic[@"share_url”]不是字符串,你却说是字符串,就会引发问题,我遇到过。

55、data[@“text”]获取的事对象,不能这么写bool a = (bool)data[@“text”]; 同样也不能这么写

NSString *string = @"0";

    int a = (int)string;

    NSLog(@"print a ===%d",a);

为什么,data[@“text”],string都是对象,你不能将一个对象转为另一个对象。

强转的时候要注意,首先,转的双方类型是不是基本一致,另外

NSArray *citys = [NSArray arrayWithObjects:@"深圳",@"北京",@"上海",@"广州", nil nil]; 

NSMutableArray *mutableArr = (NSMutableArray *)citys; 

[mutableArr removeObjectAtIndex:0];

这种转换是错的,总之,强转要当心。

 NSArray *arr = [NSArrayarrayWithObjects:@"深圳",@"北京",@"上海",@"广州",nil];

 NSDictionary *dic = [NSDictionarydictionaryWithObjectsAndKeys:@"深圳",@"city",nil];

   //可变数组

 NSMutableArray *mutableArr = [NSMutableArrayarrayWithArray:arr];

 NSMutableDictionary *mutableDic = [NSMutableDictionarydictionaryWithDictionary:dic];

这样可以的

56、for {

  staticNSInteger a =0;

   a +=1;

   NSLog(@"print a %ld", a);

}

静态值,即使每次赋值,它的值也是一步一步增加。

57、两个视图,a 加在b上,设置动画时,只需要设置b,即可,a会随着b移动而移动,不需要两个都设置。

58、

#ifndef DEBUG

#define kNetEaseisellishotapsdev @"iabcddddev"

#endif

#define kNetEaseisellishotapsdev @"iabcdddprod"

注意书写 if后面n加不加问题很大

59、

scrollsToTop是UIScrollView的一个属性,主要用于点击设备的状态栏时,是scrollsToTop == YES的控件滚动返回至顶部。

每一个默认的UIScrollView的实例,他的scrollsToTop属性默认为YES,所以要实现某一UIScrollView的实例点击设备状态栏返回顶部,则需要关闭其他的UIScrollView的实例的scrollsToTop属性为NO,很好理解,若多个scrollView响应返回顶部的事件,系统就不知道到底要将那个scrollView返回顶部了。

60、sign certificate iPhone Developer:zhagn shan (4743T2NL5999)括号里面是团队的id,证书相关。

61、libsqlite3.dylib特别注意,这个文件在我们建立数据库文件时不能丢失。

62、

shadowView?.lz_top ?? 0 -  headTopReminderButtonBottomPadding - headTopReminderButtonHeight

这么写不对,要

(shadowView?.lz_top ?? 0) -  headTopReminderButtonBottomPadding - headTopReminderButtonHeight

63、升级的一种方案

可以在app 初始化的时候返回失败,返回errMsg给用户app升级提示。

64、苹果的一些术语

 

1、pt就是point,是印刷行业常用单位,等于1/72英寸。

2、先搞清基本概念:px就是表示pixel,像素,是屏幕上显示数据的最基本的点;

3、1mm(毫米)=0.1cm(厘米)

1in(英寸)=2.54cm(厘米)

1cm(厘米)=0.01m(米)

4、视网膜(Retina)屏幕是苹果公司"发明"的一个营销术语。并在部分移动产品使用。苹果这个术语用在iphone 4手机上,自此一直沿用,它将960×640的像素压缩到一个3.5英寸的显示屏内。也就是说,该屏幕的像素密度达到326像素/英寸(ppi),称之为“视网膜屏幕”。

5、我们通常所说的显示屏多少寸( 英寸),都是按测量屏幕发光部份对角线长度来计算的(我们拿iphone5se   4寸( 英寸)屏来举例说明下:4in(英寸)=10.16cm(厘米)[1英寸等于2.54厘米]那么我们测量对角就可以测出10.16cm)

 

65、NSLineBreakMode解释: 
UILineBreakModeWordWrap = 0, 
以单词为单位换行,以单词为单位截断。

UILineBreakModeCharacterWrap, 
以字符为单位换行,以字符为单位截断。 
label.lineBreakMode = NSLineBreakByCharWrapping;以字符为显示单位显 
示,后面部分省略不显示。 
label.lineBreakMode = NSLineBreakByClipping;剪切与文本宽度相同的内 
容长度,后半部分被删除。 
label.lineBreakMode = NSLineBreakByTruncatingHead;前面部分文字 
以……方式省略,显示尾部文字内容。 
label.lineBreakMode = NSLineBreakByTruncatingMiddle;中间的内容 
以……方式省略,显示头尾的文字内容。 
label.lineBreakMode = NSLineBreakByTruncatingTail;结尾部分的内容 
以……方式省略,显示头的文字内容。 
label.lineBreakMode = NSLineBreakByWordWrapping;以单词为显示单位显 
示,后面部分省略不显示

66、dsym提示报错

(CrazyOrderAllController.m:145) 145代表报错的地方的行数

67、

Intrinsic Content Size

Intrinsic Contenet Size – Intrinsic Content Size:固有大小。顾名思义,在AutoLayout中,它作为UIView的属性(不是语法上的属性),意思就是说我知道自己的大小,如果你没有为我指定大小,我就按照这个大小来。比如:大家都知道在使用AutoLayout的时候,UILabel是不用指定尺寸大小的,只需指定位置即可,就是因为,只要确定了文字内容,字体等信息,它自己就能计算出大小来。

68、content mode 分析

(1)UIViewContentModeScaleToFill属性会导致图片变形,完全填充。

(2)UIViewContentModeScaleAspectFit会保证图片比例不变,而且全部显示在ImageView中,这意味着ImageView会有部分空白。

(3)UIViewContentModeScaleAspectFill也会证图片比例不变,但是是填充整个ImageView的,可能只有部分图片显示出来。

69、黑屏解决方法

1、可以删掉plist里面的Launch screen interface file base name 

问题:造成x不能用

2、不要用launch images source   

也就是静态的和动态的不能两者都用,只能用一个

70、那个boudrrect以及sizefit计算准确,不容怀疑

那个dsym分析工具使用的时候,要选择那个文件,不能简单的拖进去就行了,还要选择一下。

71、下面这行代码能够将view2  调整到父视图的最下面  

  1.    [self.view sendSubviewToBack:view2];  
  2.    //将view调整到父视图的最上面  
  3.    [self.view bringSubviewToFront:view1];  

72、要调用父类的方法,不能直接用实例变量的方法去获取,要通过self.去获取

73、写了东西要用command + s保存一下,否则容易丢失

74、对于只读的属性我们能通过实例变量去重新赋值,但是不能通过self.propertyname去赋值。

75、

启动页最终修复

1、调整图片布局,必须是符合六

2、去掉png

3、删掉其他的启动图

(Don't ask me why it works this way. Ask Apple.)

https://stackoverflow.com/questions/31676901/ios-8-launch-screen-storyboard-appears-black-single-xib-file-works-fine

最终的页面

https://forums.xamarin.com/discussion/38086/launchscreen-storyboard-appears-black

76、

 

CGRectUnion

Returns the smallest rectangle that contains the two source rectangles.

CGRectIntersectsRect

return两个frame 是否相交

78、

UITableView 的布局可以想象成 flow layout的一种特殊情况

流水布局与那个计算高度息息相关,流水布局不能想象成简单的布局

79、uilabel也可以加上手势

80、分销的问题进入后台为何那个alertview移除不了 ,猜测:因为进入后台后,那个window可能消失,移除不了了。

81、设置进入后台也能运行 可以参考这里

https://www.bbsmax.com/A/amd0b3WJge/

82、vc生命周期和app的生命周期

(参考文章:https://mp.weixin.qq.com/s/daYrGXNTYqI3fEK12SsWFg)

UIViewController 的生命周期

// 非storyBoard(xib或非xib)都走这个方法

 

1、- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {

    }

    return self;

}

2、// storyBoard走这个方法

- (instanceType)initWithCoder:(NSCoder *)aDecoder {

    if (self = [super initWithCoder:aDecoder]){

    }

    return self;

}

3、//xib 加载完成

-(void)awakeFromNib {

}

//加载视图(默认从nib)

4、-(void)loadView {

}

//视图控制器中的视图加载完成,viewController自带的view加载完成

5、

- (Void)viewDidLoad {

}

6、//视图将要出现

-(void)viewWillAppear:(BOOL)animated {

     [super viewWillAppear:animated];

}

7、//视图即将布局其subviews

-(void)viewWillLayoutSubviews{

    [super viewWilllayoutSubviews];

}

 

8、视图已经出现

-(void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

}

9、视图将要消失

-(void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

}

10、视图已经消失

-(void)viewDidDisappear:(BOOL)animated{

   [super viewDidDisappear:animated];

}

11、出现内存警告

-(void)didReceiveMemoryWarning{

   [super didReceiveMemoryWarning];

}

12、视图被销毁

-(void)dealloc{

}

 

app的生命周期

1、点击程序图标

2、执行main函数

3、通过UIApplicationMain函数

4、初始化UIApplication对象并设置代理,UIApplication对象代理有: {

     1、程序载入后:applicationDidFinishLaunching

     2、将要进入非活动状态:applicationWillResignActive

     3、程序进入活动状态:applicationDidBecomeActive

     4、程序进入后台:applicationDidEnterBackground 

     5、程序从后台将要进入前台:applicationWillEnterForeground

     6、内存警告,程序将要终止:applicationDidReceivememoryWarning

     7、程序将要推出结束:applicationWillTerminate

}

5、UIApplication 监听系统事件

6、程序结束退出

89、几点经验

(1)、第一点一定要及时commit ,一旦出问题,排查起来,根据系统的指引提示的位置,排查困难很大。

(2)、有时候如果是低级错误指引的位置不一定对,找不到问题原因可以从低级错误角度来思考。

 self.lz_tableView.contentInset = UIEdgeInsetsMake(-34, 0, 0, 0);

设置tableviewcell从top开始,而不是默认从中间开始

90、后台下载设置方法

 

90、dispatch_semaphore(打旗号)用来控制并发

1dispatch_semaphore_create 创建一个semaphore

2dispatch_semaphore_signal发送一个信号

3dispatch_semaphore_wait等待信号

 

dispathc_semaphore_create理解为信号的总量,dispatch_semaphore_signal是发送一个信号,自然会让信号总量加1dispatch_semaphore_wait等待信号,当信号总量少于0的时候就会一直等待,否则就可以正常的执行,并让信号总量为1,

91、iOS传感器知识

参考原文:

https://www.cnblogs.com/Kingly/p/5275237.html

 

1、传感器

一关灯,iPhone 会自动调整屏幕的亮度

在地图应用中,能判断出手机面向的方向

打电话时,人脸贴近iPhone屏幕时,屏幕会自动锁屏

2、各种传感器

环境光传感器是iPhone 和mac设备中最为古老的传感器人员,它能够让你在使用Mac,iPhone,iPad时,眼睛更为舒适,从一个明亮的室外走入相对黑暗的室内后,iOS设备会自动调低亮度,让屏幕显得不再那么光亮刺眼,当你使用iPhone 拍照时,闪光灯会在一定条件下自动开启,几乎所有的Mac都带有背光键盘,当周围光纤弱到一定条件时,会自动开启键盘背光。

 

3、距离传感器用于检测是否有其他物体靠近设备屏幕,当你打电话或者接电话时将电话屏幕贴在耳边,iPhone 会自动关闭屏幕,好处是节省电量,防止耳朵活面部不小心触碰屏幕而引起一些不想要的意外操作。


4、磁力计传感器(Magnetometer Sensor)
可以感应地球磁场, 获得方向信息, 使位置服务数据更精准
可以用于电子罗盘和导航应用
iPad的Smart Cover盒盖睡眠操作就是基于磁力计传感器


5、内部温度传感器(Internal Temperature Sensor)
从 iPad一代开始,iOS设备都加入了一个内部温度传感器,用于检测内部组件温度,当温度超过系统设定的阈值时,会出现以下提示 


6、湿度传感器(Moisture Sensor)
湿度传感器跟其他基于微电子的传感器不同,是一个简单的物理传感器

简单来说,湿度传感器就是一张遇水变红的试纸

Apple的维修人员就是通过检测试纸是否变红,来判断设备是否进水
(设备进水不在保修范围之内)


7、陀螺仪(Gyroscope)
陀螺仪是随着iPhone4的上市首次出现在iOS设备上的传感器
陀螺仪的原理是检测设备在X、Y、Z轴上所旋转的角速度

陀螺仪在赛车类游戏中有重大作用:
模拟汽车驾驶时方向盘旋转的动作 
使得这类游戏的操控体验更为真实

8、加速计传感器(Motion/Accelerometer Sensor)
最早出现在iOS设备上的传感器之一
加速计用于检测设备在X、Y、Z轴上的加速度 (哪个方向有力的作用)

加速计可以用于检测设备的摇晃,经典应用场景
摇一摇
计步器

92、推送的流程 ,图片来源网络

93、启动页图片尺寸

1125 * 2436

5.5:  1242×2208

4.7:750×1334

Retina 4:640×1136

2x:640×960

点击Aseets ——> 点击创建launchImage

然后设法将那边的文件夹替换成这个文件夹

创建launchImage文件夹时,要将非必要的类型去掉,比如pad,ios 6等

94、pop回来之后timer还在运行,要想办法将这个移除掉。

 (BOOL)judgeIsPush{

    NSArray *viewControllers = self.navigationController.viewControllers;//获取当前的视图控制其

    if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) {

        //当前视图控制器在栈中,故为push操作

        return YES;

    } else if ([viewControllers indexOfObject:self] == NSNotFound) {

        //当前视图控制器不在栈中,故为pop操作

        return NO;

    }else{

        return NO;

这是判断pop还是push的方法,如果是pop要设法将之前的vc的timer移除。

    }

}

95、

提交苹果审核通过后,用户通过App Store自动更新之后,更新之后的程序还是老版本程序,需要卸载重新安装一次才是最新的版本里面的功能。之前客户更新之后就发现了这个问题,那个时候就给用户说试试卸载重新安装,结果运行正常了。今天有发布了更新,结果又出现了这个问题。请问这是什么问题?

可以参考: http://ask.dcloud.net.cn/question/50777

96、

1、蒲公英和fim要想发布特定的二维码要去里面的,否则发布的都是最新的

2、即使我们设置错了版本号,我们在版本信息的下面可以修改的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值