博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS之08-核心语法
阅读量:5958 次
发布时间:2019-06-19

本文共 3167 字,大约阅读时间需要 10 分钟。

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 
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 
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;  // getter2 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 *)name3                          age:(int)age {4     if (self = [super init]) {5         _name = name;6         _age = age;7     }8     return self;9 }

转载于:https://www.cnblogs.com/gfxxbk/p/5296238.html

你可能感兴趣的文章
JavaWeb网上图书商城完整项目--day02-10.提交注册表单功能之页面实现
查看>>
做程序开发的你如果经常用Redis,这些问题肯定会遇到
查看>>
006android初级篇之jni数据类型映射
查看>>
Java 集合框架查阅技巧
查看>>
apache配置虚拟主机
查看>>
CollectionView水平和竖直瀑布流的实现
查看>>
前端知识复习一(css)
查看>>
spark集群启动步骤及web ui查看
查看>>
利用WCF改进文件流传输的三种方式
查看>>
Spring学习总结(2)——Spring的常用注解
查看>>
关于IT行业人员吃的都是青春饭?[透彻讲解]
查看>>
钱到用时方恨少(随记)
查看>>
mybatis主键返回的实现
查看>>
org.openqa.selenium.StaleElementReferenceException
查看>>
数论之 莫比乌斯函数
查看>>
linux下查找某个文件位置的方法
查看>>
python之MySQL学习——数据操作
查看>>
Harmonic Number (II)
查看>>
长连接、短连接、长轮询和WebSocket
查看>>
day30 模拟ssh远程执行命令
查看>>