黑马程序员技术交流社区

标题: 学习笔记13-OC@property和构造方法 [打印本页]

作者: 仰望星空的猪    时间: 2015-11-27 10:45
标题: 学习笔记13-OC@property和构造方法
1 OC传统get和set方法
2点语法
        只能使用点语法设置成员变量(get和set方法),不能访问其他方法。
        Person  *p = [Person new];
        赋值:p.name=“xiaoming”;  //(xcode优化)访问的是成员变量set方法。
        取值:int  a =p.age;           // 访问的是成员变量get方法。
注意
1)        在set和get方法中不能使用 self.age =age 设置_age 值,会不断调用自己造成死循环。和JAVA中的this指针有区别 java 中可以使用 this.age=age;
2)        点语法的本质是set和get方法的调用不是访问成员变量。
3 @property
        是编译器指令,告诉编译器声明属性的访问器(声明get和set方法)。
使用
        @property 类型名 方法名(规范写法下,成员变量名去掉下划线)。
                @property int  age; //相当于_age 的set和get方法的声明。
        注意
1)        只能写在声明的地方 @interface 和@end之间。
2)        类型一致可以写在一起 @property int  age ,weight。

@property 的增强使用
        xcode 4.4 之后 只需要声明使用@property 声明 Xcode会自动实现。
        @property int  age  ;//声明的是_age的set和get方法 实现的也是_age的set和get方法。如果没有_age 会自动生成。可以被子类继承。

4 @synthesize
        是编译器指令,告诉编译器实现属性的访问器(实现get和set方法)。
        使用
        @synthesize  age ; //相当于实现了 声明的方法为age的get和set方法。
                        但是get和set方法操作的不是_age这个实例变量
注意
方法名必须先@property中声明。
        多个实例变量可以放在一行 建议只把类型一致的写在一起。
@synthesize  age weight  name;
                指定实例变量赋值
                @synthesize  age=_age ; //默认操的是下划线的_age。
5  @property set和get方法的重写
                和手动实现set和get方法一样。
6 动态类型和静态类型
        动态类型:程序执行的时候才知道所属类型。
        静态类型;将一个变量定义为特定类的对象。编译的时候就知道变量的类型。
7  id类型
         NSObject 访问子类的方法。
         NSObject是所有类的基类。NSObject 指针可以指向任何类对象。
         id是通用的对象类型,可以存储任何类对象,万能指针。
         使用
                        id  obj  ;
                        obj = [Person  new];
                        此时 obj 就可以调用Person  里的方法了。
                       
                NSObejct  编译时检查 调用子类方法时需要 强制转换
                id         运行时检查 不需要强制转换。
                id和insanetype
                都可以作为方法的返回类型,
                insanetype 可以返回和方法类型相同类型的对象 id只能返回未知类型对象
                insanetype 只能作为返回值  id还可以作为参数。
8 动态类型检测
        动态绑定;一个对象是否调用指定的方法不是编译器决定而是运行时 决定。
        动态检测:检测 一个实例对象是否是某类或者某类子类的实例。
       
                BOOL is=[ ani isKingOfClass :[Animal class]];//       
                is:返回值
                ani:实例对象
                isKingOfClass: 检测方法
                [Animal class]: 类对象
isKingOfClass 检测 ani 是否是Animal类或者子类的实例对象
isMemberOfClass          检测 ani 是否是Animal类不包括子类的实例对象
isSubClassOFClass 检测类对象是否继承类对象
        BOOL is= [Dog  isSubClassOFClass :[Animal class]];

                判断对象能否响应指定方法
                        SEL  sel =@selectot(eat);  //包装eat方法
                        BOOL  isRsp=[ ani respondsToSelectot:sel];//判断ani 是否可以响应eat方法
                        BOOL  isRsp=[ ani respondsToSelectot:@selector(eat)];
9 构造方法的概念
        用来初始化对象的方法。
        重写构造方法 为了让对象创造出来的时候就有某些初值。构造方法是对象方法。
       
        new = alloc+init;
alloc:为对象创建空间,返回未初始化的对象
init:调用对象方法进行初始化返回对象本身。
重写 init方法
-        instancetype  init{
self=[super init ] ;     //先让父类做完自己初始化。
if(self){                       //判断父类是否初始化成功
        子类初始化代码;//子类成员变量赋初值
}
return self;                    //返回调用者自身。
}
自定义构造方法
1)        一定是对象方法
2)        返回值一般为id类型
3)        方法名以 initWith开头。
类比 NSString *str =[ NSString stringWithFormat:@””];

作者: caizexu    时间: 2015-11-27 16:11
感谢分享
作者: 不回头    时间: 2015-11-27 23:14
感谢分享
作者: 呐小伟    时间: 2015-11-28 00:27
感谢分享..........
作者: 罗文强    时间: 2015-11-28 00:28
来顶楼主!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2