• iOS之08-核心语法


    1、点语法

     点语法( . )本质还是方法调用, java中的是访问成员变量, 在OC直接访问成员变量的方式只有 ->

    1         p.age = 10; // [p setAge:10]
    2         
    3         int a = p.age; // [p age]

     点语法造成的死循环

     1 // age的setter和getter方法
     2 - (void)setAge:(int)age {
     3 
     4     // 会引发死循环
     5     //    self.age = age; // [self setAge:age]
     6 }
     7 - (int)age {
     8 
     9     // 会引发死循环
    10     //    return self.age; // [self age]
    11 }

    实例代码:

    Person.h:

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface Person : NSObject
     4 {
     5     int _age;
     6 }
     7 
     8 // age的setter和getter方法
     9 - (void)setAge:(int)age;
    10 - (int)age;
    11 
    12 @end

    person.m:

     1 #import "Person.h"
     2 
     3 @implementation Person
     4 
     5 // age的setter和getter方法
     6 - (void)setAge:(int)age {
     7     _age = age;
     8     NSLog(@"setAge");
     9     
    10     // 会引发死循环
    11     //    self.age = age; // [self setAge:age]
    12 }
    13 - (int)age {
    14     NSLog(@"age");
    15     return _age;
    16     // 会引发死循环
    17     //    return self.age; // [self age]
    18 }
    19 @end

    main.m:

     1 #import <Foundation/Foundation.h>
     2 #import "Person.h"
     3 
     4 int main(int argc, const char * argv[]) {
     5     @autoreleasepool {
     6         Person *p = [Person new];
     7 
     8         p.age = 10; // [p setAge:10]
     9         
    10         int a = p.age; // [p age]
    11         
    12         NSLog(@"%d", a);
    13     }
    14     return 0;
    15 }

    2、@property和@synthesize

     1> @property

      ① 用在@interface

      ② 用来自动生成settergetter声明

      ③ 用@property int age; 就可以代替下面的两行

    1 - (int)age;  // getter
    2 
    3 - (void)setAge:(int)age;  // setter

     2> @synthesize

      ① 用在@implementation

      ② 用在自动生成settergetter实现

      ③ 用@synthesize age = _age; 就可以代替下面的代码

    1 - (void)setAge:(int)age {
    2     _age = age;
    3 }
    4 - (int)age {
    5     return _age;
    6 }

     3> @synthesize 的细节

      ① @synthesize age = _age;

       settergetter 实现中会访问成员变量 _age

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

      ② @synthesize age;

       settergetter 实现中会访问成员变量 age

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

      ③ 手动实现

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

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

       若手动实现了 settergetter 方法,编译器就不会自动生成不存在成员变量

       @property 新特性

       自从Xcode4.5后,@property 就独揽了 @synthesize功能。也就是说, @property 可以同时生成 settergetter声明实现

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

    如果存在setter或getter方法,点语法使用时系统就会优先选择存在的方法

     3、id

     1> 简介

    • 万能指针,能指向操作任何OC对象id == NSOBject *
    • id 类型的定义

      typedef struct objc_object {

        Class isa;

      } *id;

     2> 使用

      注意:id 后面不要加 *

      id p = [Person new];

     3> 局限性

      调用一个不存在的方法,编译器会报错

     4、构造方法

     1> 完整的创建一个可用的对象 

    • 分配存储空间 +alloc        
    • 初始化 -init

     2> 构造方法

      用来初始化对象的方法,是个对象方法"-" 开头。

      目的:为了让对象创建出来,成员变量就会有一定的固定值

     3> 重写构造方法的注意点 

    • 调用父类的构造方法([super init])
    • 进行子类内部成员变量的初始化

     4> 实现代码

     1 // 重写init方法
     2 - (instancetype)init {
     3     // 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
     4 //    self = [super init]; // 当前对象 self
     5     
     6     // 2.如果对象初始化成功,才有必要进行接下来的初始化
     7     if (self = [super init]) {
     8         // 初始化成功
     9         _age = 10;
    10     }
    11     
    12     // 3.返回一个初始化完毕的对象
    13     return self;
    14 }

     5> 自定义构造方法规范

    •  一定是对象方法,一定以 "-" 开头
    • 返回值一般是instancetype类型
    • 方法名一般以init开头
    • 代码实现
    1 // 自定义多参初始化方法
    2 - (instancetype)initWithName:(NSString *)name
    3                          age:(int)age {
    4     if (self = [super init]) {
    5         _name = name;
    6         _age = age;
    7     }
    8     return self;
    9 }
  • 相关阅读:
    背景透明度IE兼容性代码
    酷站收藏
    洛谷P1142 轰炸 数学
    洛谷P1282 多米诺骨牌
    洛谷P1247 取火柴游戏 数学题 博弈论
    洛谷P1135 奇怪的电梯 广搜
    洛谷P1077 摆花 动态规划
    洛谷P1161 开灯 数学
    洛谷P1154 奶牛分厩 数学
    洛谷P2147 [SDOI2008]Cave 洞穴勘测 Link-Cut Tree LCT
  • 原文地址:https://www.cnblogs.com/gfxxbk/p/5296238.html
Copyright © 2020-2023  润新知