蓝懿ios技术交流和心得分享2016年01月21日

1.静态类型和动态类型

  • 静态类型
    • 将一个指针变量定义为特定类的对象时,使用的是静态类型,在编译的时候就知道这个指针变量所属的类,这个变量总是存储特定类的对象。
Person *p = [Person new];
  • 动态类型
    • 这一特性是程序直到执行时才确定对象所属的类
id obj = [Person new];

2.为什么要有动态类型?

  • 我们知道NSObject是OC中的基类
  • 那么任何对象的NSObject类型的指针可以指向任意对象,都没有问题
  • 但是NSObject是静态类型,如果通过它直接调用NSObject上面不存在的方法,编译器会报错。
  • 你如果想通过NSObject的指针调用特定对象的上面,就必须把NSObject * 这种类型强转成特定类型。然后调用。如下
//定义NSObject * 类型
 NSObject* obj = [Cat new];
 Cat *c = (Cat*)obj
 [c eat];
  • id 是一种通用的对象类型,它可以指向属于任何类的对象,也可以理解为万能指针 ,相当于C语言的 void *
  • 因为id是动态类型,所以可以通过id类型直接调用指向对象中的方法, 编译器不会报错
/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;
 id obj = [C at new];
 [obj eat]; // 不用强制类型转换

 [obj test]; //可以调用私有方法
  • 注意:
    • 在id的定义中,已经包好了*号。Id指针只能指向OC中的对象
  • 为了尽可能的减少编程中出错,Xcode做了一个检查,当使用id 类型的调用本项目中所有类上都没有的方法,编译器会报错
  • id类型不能使用.语法, 因为.语法是编译时特性, 而id是运行时特性

3.id数据类型与静态类型

  • 虽然说id数据类型可以存储任何类型的对象,但是不要养成滥用这种通用类型

  • 如没有使用到多态尽量使用静态类型
  • 静态类型可以更早的发现错误(在编译阶段而不是运行阶段)
  • 静态类型能够提高程序的可读性
  • 使用动态类型前最好其真实类型
  • 动态类型判断类型

  • - (BOOL)isKindOfClass:classObj 判断实例对象是否是这个类或者这个类的子类的实例
    Person *p = [Person new];
    Student *stu = [Student new];

    BOOL res = [p isKindOfClass:[Person class]];
    NSLog(@"res = %i", res); // YES
    res = [stu isKindOfClass:[Person class]];
    NSLog(@"res = %i", res); // YES
+ \- (BOOL) isMemberOfClass: classObj 判断是否是这个类的实例
    Person *p = [Person new];
    Student *stu = [Student new];

    BOOL res = [p isMemberOfClass:[Person class]];
    NSLog(@"res = %i", res); // YES
    res = [stu isMemberOfClass:[Person class]];
    NSLog(@"res = %i", res); // NO
+ \+ (BOOL) isSubclassOfClass:classObj 判断类是否是指定类的子类)
    BOOL res = [Person isSubclassOfClass:[Student class]];
    NSLog(@"res = %i", res); // NO

    res = [Student isSubclassOfClass:[Person class]];
    NSLog(@"res = %i", res); // YES

new方法实现原理

1.new方法实现原理

  • 完整的创建一个可用的对象:Person *p=[Person new];new方法的内部会分别调用两个方法来完成3件事情:
    • (1)使用alloc方法来分配存储空间(返回分配的对象);
  • (2)使用init方法来对对象进行初始化。
  • (3)返回对象的首地址
This method is a combination of alloc and init. Like alloc, it initializes the isa instance variable of the new object so it points to the class data structure. It then invokes the init method to complete the initialization process.
  • 可以把new方法拆开如下:

  • (1).调用类方法+alloc分配存储空间,返回未经初始化的对象Person *p1=[person alloc];
  • (2).调用对象方法-init进行初始化,返回对象本身 Person *p2=[p1 init];
  • (3).以上两个过程整合为一句:Person *p=[[Person alloc] init];
  • 说明:

  • alloc 与 init合起来称为构造方法,表示构造一个对象
  • alloc 方法为对象分配存储空间,并将所分配这一块区域全部清0. The isa instance variable of the new instance is initialized to a data structure that describes the class; memory for all other instance variables is set to 0.
  • init方法是初始化方法(构造方法),用来对象成员变量进行初始化,默认实现是一个空方法。An object isn’t ready to be used until it has been initialized. The init method defined in the NSObject class does no initialization; it simply returns self.
  • 所以下面两句的作用是等价的Person *p1 = [Person new];Person *p = [[Person alloc] init];

  • iOS 程序通常使用[[类名 alloc] init] 的方式创建对象,因为这个可以与其他initWithXX:...的初始化方法,统一来。代码更加统一

    **************************************************************​********* 

Autolayout自动布局

Mar 23, 2014

Autoresizing

imgView.autoresizingmask =

  • UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
    • 距离父控件左边的间距是伸缩的
  • UIViewAutoresizingFlexibleRight

Margin = 1 << 2,

  • 距离父控件右边

的间距是伸缩的

  • UIViewAutoresizingFlexibleTop

Margin = 1 << 3,

  • 距离父控件上边

的间距是伸缩的

  • UIViewAutoresizingFlexibleBottom

Margin = 1 << 5

  • 距离父控件下边

的间距是伸缩的

  • UIViewAutoresizingFlexibleWidth

 = 1 << 1,

  • 宽度

跟随父控件宽度进行伸缩

  • UIViewAutoresizingFlexibleHeight

 = 1 << 4,

  • 高度

跟随父控件高度进行伸缩

2个核心概念

  • 约束

  • 尺寸约束
    • width约束
  • height约束
  • 位置约束
    • 间距约束(上下左右间距)
  • 参照

  • 所添加的约束跟哪个控件有关(相对于哪个控件来说)

常见单词

  • Leading -> Left -> 左边
  • Trailing -> Right -> 右边

UILabel实现包裹内容

  • 设置宽度约束为 <= 固定值
  • 设置位置约束
  • 不用去设置高度约束

代码实现Autolayout的步骤

  • 利用NSLayoutConstraint类创建具体的约束对象
  • 添加约束对象到相应的view上 objc \- (void)addConstraint:(NSLayoutConstraint *)constraint; \- (void)addConstraints:(NSArray *)constraints;
  • 代码实现Autolayout的注意点
    • 要先禁止autoresizing功能,设置view的下面属性为NO
  • view.translatesAutoresizingMaskIntoConstraints = NO;
  • 添加约束之前,一定要保证相关控件都已经在各自的父控件上
  • 不用再给view设置frame

NSLayoutConstraint

  • 一个NSLayoutConstraint对象就代表一个约束

创建约束对象的常用方法objc+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;

- view1 :要约束的控件- attr1 :约束的类型(做怎样的约束)- relation :与参照控件之间的关系- view2 :参照的控件- attr2 :约束的类型(做怎样的约束)- multiplier :乘数- c :常量

自动布局的核心计算公式

obj1.property1 =(obj2.property2 * multiplier)+ constant value

VFL示例

  • H:[cancelButton(72)]-12-[acceptButton(50)]

  • canelButton宽72,acceptButton宽50,它们之间间距12
  • H:[wideView(>=60@700)]

  • wideView宽度大于等于60point,该约束条件优先级为700(优先级最大值为1000,优先级越高的约束越先被满足)
  • V:[redBox][yellowBox(==redBox)]

  • 竖直方向上,先有一个redBox,其下方紧接一个高度等于redBox高度的yellowBox
  • H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|

  • 水平方向上,Find距离父view左边缘默认间隔宽度,之后是FindNext距离Find间隔默认宽度;再之后是宽度不小于20的FindField,它和FindNext以及父view右边缘的间距都是默认宽度。(竖线“|” 表示superview的边缘)

VFL的使用

使用VFL来创建约束数组+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary *)views;format :VFL语句opts :约束类型metrics :VFL语句中用到的具体数值views :VFL语句中用到的控件

创建一个字典(内部包含VFL语句中用到的控件)的快捷宏定义NSDictionaryOfVariableBindings(...)

  • 学习ios  重要还是要理清楚思路  在做或者看老师代码的时候 自己多想想为什么  不要自己看着就抄       另外还是要推荐一下 蓝懿IOS这个培训机构  和刘国斌老师刘国斌老师还是很有名气的,听朋友说刘老师成立了蓝懿iOS,,老师讲课方式很独特,能够尽量让每个人都能弄明白,有的比较难懂的地方,如果有的地方还是不懂得话,老师会换个其它方法再讲解,这对于我们这些学习iOS的同学是非常好的,多种方式的讲解会理解得更全面,这个必须得给个赞,嘻嘻,还有就是这里的学习环境很好,很安静,可以很安心的学习,安静的环境是学习的基础,小班讲课,每个班20几个学生,学习氛围非常好,每天都学到9点多才离开教室,练习的时间很充裕,而且如果在练习的过程中有什么困难,随时可以向老师求助,不像其它机构,通过视频教学,有的甚至学完之后都看不到讲师本人,问点问题都不方便,这就是蓝懿与其它机构的区别,相信在刘国斌老师的细心指导下,每个蓝懿学员都能找到满意的工作,加油!
  •                                                                   写博客第一百零三天;

                                                                              QQ:565803433

 



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值