1、点语法

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

  1. p.age = ; // [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 = ; // [p setAge:10]
  9.  
  10. int a = p.age; // [p age]
  11.  
  12. NSLog(@"%d", a);
  13. }
  14. return ;
  15. }

2、@property和@synthesize

 1> @property

  ① 用在@interface中

  ② 用来自动生成setter和getter的声明

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

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

 2> @synthesize

  ① 用在@implementation中

  ② 用在自动生成setter和getter的实现

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

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

 3> @synthesize 的细节

  ① @synthesize age = _age;

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

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

  ② @synthesize age;

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

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

  ③ 手动实现

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

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

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

  ④ @property 新特性

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

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

如果存在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. }
  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. }

iOS之08-核心语法的更多相关文章

  1. iOS - Core Animation 核心动画

    1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...

  2. 第二章 JavaScript核心语法

    第二章   avaScript核心语法 一.变量的声明和赋值 JavaScript是一种弱类型语言,没有明确的数据类型,也就是在声明变量时不需要指定数据类型,变量的类型由赋给变量的值决定. 在Java ...

  3. css基本概念与css核心语法介绍

    css基本概念 css是什么?不需要了解太多文字类介绍,记住css是层叠样式表,HTML是页面结构,css负责页面样式,javascrt负责静态页面的交互.CSS 能够对网页中元素位置的排版进行像素级 ...

  4. IOS 开发-- 常用-- 核心代码

    网络请求 (包含block 和 delegate) 数据持久化技术 手势处理’ XML数据解析 多线程实现 核心动画编程 地图定位功能 CoreData数据持久化技术 本地通知和推送通知 常用宏定义 ...

  5. [php入门] 2、基础核心语法大纲

    1 前言 最近在学PHP,上节主要总结了PHP开发环境搭建<[php入门] 1.从安装开发环境环境到(庄B)做个炫酷的登陆应用>.本节主要总结PHP的核心基础语法,基本以粗轮廓写,可以算作 ...

  6. 黑马程序员——OC语言 核心语法(2)

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)id 1)简介:万能指针,能指向任何OC对象,相当于NSObject ...

  7. 黑马程序员——OC语言 核心语法(1)

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)点语法 点语法其实本质上还是方法调用 当使用点语法时,编译器会自动展 ...

  8. IOS开发系列 --- 核心动画

    原始地址:http://www.cnblogs.com/kenshincui/p/3972100.html 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥i ...

  9. iOS开发之核心动画(Core Animation)

    1.概述 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍,使用它需要先添加QuartzCore.framework和引入对应的框架< ...

  10. iOS:CALayer核心动画层

    CALayer:核心动画层 简介: Core Animation 是跨平台的,支持iOS环境和Mac OS X环境 学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView, ...

随机推荐

  1. [Android]在代码混淆中关闭 Log

    -assumenosideeffects class android.util.Log{ public static *** d(...); public static *** e(...); }

  2. iOS 百度地图坐标标注

    注:由于iOS9改用更安全的https,为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置,否则影响SDK的使用. <key>NSApp ...

  3. mysqli扩展库的预处理技术 mysqli stmt

    //预编译演示 //1,创建mysqli对象 $mysqli=new mysqli("localhost","root",""," ...

  4. Delphi多线程开发注意事项

    Q1: 多线程中需避免多个线程同时向全局变量进行写入操作,导致访问冲突问题. A1:  可以通过使用加锁机制(比如:临界区.互斥.信号量)解决此问题. Q2:多线程中对于结构体和CLASS类型的全局变 ...

  5. SQL的一切常用函数展示

    练习了一下, 用时再慢慢看吧. SHOW WARNINGS; SELECT quote(text_fld) FROM string_tbl; ), 'n'); SELECT ASCII('ö'); S ...

  6. 如何实现Outlook 2010 下载邮件后自动删除服务器上的邮件

    outlook2010---文件---信息---账户设置---选中要设置的帐号---双击点选要设置的邮箱---其他设置---高级---在服务器上保留邮件的副本---14天后删除服务器上的邮件副本,修改 ...

  7. Windows Live Writer技巧

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:今天的内容虽然和开发技术无关,却应该和喜欢写东西的技术人员有关,比如我所有的文章都是用 ...

  8. Zigzag convert

    public static String Convert(String s,int row) { char[] c=s.toCharArray(); int len=s.length(); Strin ...

  9. 字节流、字符串、16进制字符串转换__Java(转)

    /** * @Package: * @ClassName:TypeConversion * @Description:字节流.字符串.16进制字符串转换 * @author:xk * @date:Ja ...

  10. [Liferay6.2]Liferay Dynamic Query API示例

    介绍 Liferay提供了几种方法定义复杂的查询用来检索数据库中的数据. 通常情况下,在每个service Entity中,通过定义一些'finder'方法,可以便捷地满足基本的数据查询操作. 但是, ...