zoukankan      html  css  js  c++  java
  • IOS笔记-和新语法

    一:点语法

    1>用点语法替换set方法和get方法

     1
     2
     3
     4
     5
     6
     7
     8
    // 方法调用
    Student *stu = [Student new];
    [stu setAge:100];
    int age = [stu age];
     
    // 点语法
    stu.age = 100;
    int age = stu.age;
     来自CODE的代码片
    点语法.m

    2>点语法的本质

    **其实点语法的本质还是方法调用

    **当使用点语法时,编译器会自动展开成相应的方法

    3>死循环注意

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
    - (void) setAge:(int)age
    {
    // 下面的代码会引发死循环
    self.age = age;
    }
    - (int) age
    {
    // 下面的代码会引发死循环
    return self.age;
    }
     来自CODE的代码片
    死循环.m

    二:成员变量的作用域

    局部变量,全局变量都有自己的作用域。成员变量也有自己的作用域。

    1>作用域类型

    1.@private:只能在当前类的对象方法中直接访问

    (可以用get方法、set方法访问);

    (在@implementation中声明的对象默认为@private,@public无效)

    2.@protect:只能在当前类和子类的对象方法中直接访问

    (在@interface中如果不加作用域类型,默认为@protect)

    3.@public:任何地方都可以直接访问成员变量

    4.@package:同一个“体系内”(框架)可以访问,介于@private和@public之间。

    (只要处在同一个框架中,就能直接访问对象的成员变量。)

    注意:没有@interface,只有@implementation,也可以开发一个类。

    @implementaion中不能定义和@interface中同名的成员变量。

    三:编辑器特性:@property和@synthesize

    1> @property 

    用在@interface中,可以自动生成成员变量的setter和getter声明;

     1
     2
     3
     4
    @property int age; // 可以替代以下两行
     
    // -> -(void)setAge:(int)age;
    // -> -(int)age;
     来自CODE的代码片
    @property.m

    2>@synthesize

    用在@implementation 中,可以自动生成成员变量的set和get方法的实现。

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
    @synthesize age = _age; // 可以替代以下几句
    /*
    -(void)setAge:(int)age
    {
    _age = age;
    }
    -(int)age
    {
    return _age;
    }
    */
     来自CODE的代码片
    @synthesize.m
    3>@synthesize的细节

    @synthesize age = _age;

    1.setter和getter实现中会访问成员变量_age

    2.如果成员变量_age不存在,就会自动生成一个@private的成员变量_age

    @synthesize age;

    1.setter和getter实现中会访问成员变量age

    2.如果成员变量age不存在,就会自动生成一个@private的成员变量age

    手动实现

    1.若手动实现了setter方法,编译器就只会自动生成getter方法

    2.若手动实现了getter方法,编译器就只会自动生成setter方法

    3.若同时手动实现了setter和getter方法,编译器就不会自动生成不存在的成员变量

    4> @property新特性

    自从Xcode 4.x后,@property就独揽了@synthesize的功能。也就是说,@property可以同时生成setter和getter的声明和实现

    默认情况下,setter和getter方法中的实现,会去访问下划线 _ 开头的成员变量

    所以在现在的Xcode版本下,可以最大化的简洁书写。
    举例:
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
    @interface Person:NSObject
    // 成员变量的get set方法申明和实现,一步实行。
    @property int age;
    @property double weight;
    @property NSString *name;
    @end
     
    @implementation Person
    @end
     
    int main()
    {
    Person *p = [Person new];
    return 0;
    }
     来自CODE的代码片
    property.m
     
    四:id
    id是一个类型,是一个万能指针,能指向任何OC对象,相当于NSObject *
     1
     2
    Person *p = [Person new];
    // 等同于id p = [Person new];
     来自CODE的代码片
    id.m

    id类型的定义

    typedefstruct objc_object {

        Class isa;

    } *id;

    注:id类型后面不能加*;

    NSString *_name;

    ->id _name;

    五:构造方法

    1>对象创建两部曲

    [person new]  这里面的new完整的创建了一个可用的对象

    1.分配存储空间    (类方法) +alloc

    2.初始化                (对象方法)-init

    // 调用+alloc 分配存储空间

    Person *p1 = [Person alloc];

    // 调用- init进行初始化

    Person *p2 = [P1 init];

    以上两步可以浓缩为一步

    Person *p3 = [[person alloc] init];

    -init方法就是构造方法

    2>构造方法

    构造方法就是用来初始化对象的方法,是个对象方法。以‘-’开头。

    初始化对象原理:

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
    // 每个Person对象创建出来,他的成员变量_age值为10
    // -init进行初始化,重写-init方法,定义_age值,在@implementation中实现
    - (id)init // 不确定init类型,所以用万能类型
    {
    // 1.一定要调用回super(父类)的init方法:初始化父类中声明的一些成员变量和其他属性
    self = [super init]; //当前对象self
     
    // 2.如果对象初始化成功,才有必要进行接下来的初始化
    if(self != nil) // 当前不为空
    {
    // 初始化成功
    _age = 10;
    }
    // 3.返回一个已经初始化完毕的对象
    return self;
    }
     来自CODE的代码片
    init.m
    简化方法:
     1
     2
     3
     4
     5
     6
     7
     8
    - (id)init
    {
    if(self = [super init])
    {
    _age = 10;
    }
    return self;
    }
     来自CODE的代码片
    init1.m
    重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值。

    重写构造方法的注意点:

    1.先调用父类的构造方法[super init]

    2.再进行子类内部成员变量的初始化。

  • 相关阅读:
    MySQL监控脚本
    django学习笔记【004】创建带有model的app
    MySQL-group-replication 配置
    MySQL配置文件模板
    Python 正则表达式
    MYSQL的安全模式:sql_safe_updates介绍
    Git branch && Git checkout常见用法
    git rebase和git merge的用法
    Git最牛最全详解
    理解npm run
  • 原文地址:https://www.cnblogs.com/houzhitong/p/4511721.html
Copyright © 2011-2022 走看看