iOS之08-核心语法
1、点语法
点语法( . )的本质还是方法调用, java中的点是访问成员变量, 在OC中直接访问成员变量的方式只有 ->
p.age = ; // [p setAge:10]
int a = p.age; // [p age]
点语法造成的死循环
// age的setter和getter方法
- (void)setAge:(int)age { // 会引发死循环
// self.age = age; // [self setAge:age]
}
- (int)age { // 会引发死循环
// return self.age; // [self age]
}
实例代码:
Person.h:
#import <Foundation/Foundation.h> @interface Person : NSObject
{
int _age;
} // age的setter和getter方法
- (void)setAge:(int)age;
- (int)age; @end
person.m:
#import "Person.h" @implementation Person // age的setter和getter方法
- (void)setAge:(int)age {
_age = age;
NSLog(@"setAge"); // 会引发死循环
// self.age = age; // [self setAge:age]
}
- (int)age {
NSLog(@"age");
return _age;
// 会引发死循环
// return self.age; // [self age]
}
@end
main.m:
#import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new]; p.age = ; // [p setAge:10] int a = p.age; // [p age] NSLog(@"%d", a);
}
return ;
}
2、@property和@synthesize
1> @property
① 用在@interface中
② 用来自动生成setter和getter的声明
③ 用@property int age; 就可以代替下面的两行
- (int)age; // getter - (void)setAge:(int)age; // setter
2> @synthesize
① 用在@implementation中
② 用在自动生成setter和getter的实现
③ 用@synthesize age = _age; 就可以代替下面的代码
- (void)setAge:(int)age {
_age = age;
}
- (int)age {
return _age;
}
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> 实现代码
// 重写init方法
- (instancetype)init {
// 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
// self = [super init]; // 当前对象 self // 2.如果对象初始化成功,才有必要进行接下来的初始化
if (self = [super init]) {
// 初始化成功
_age = ;
} // 3.返回一个初始化完毕的对象
return self;
}
5> 自定义构造方法规范
- 一定是对象方法,一定以 "-" 开头
- 返回值一般是instancetype类型
- 方法名一般以init开头
- 代码实现
// 自定义多参初始化方法
- (instancetype)initWithName:(NSString *)name
age:(int)age {
if (self = [super init]) {
_name = name;
_age = age;
}
return self;
}
iOS之08-核心语法的更多相关文章
- iOS - Core Animation 核心动画
1.UIView 动画 具体讲解见 iOS - UIView 动画 2.UIImageView 动画 具体讲解见 iOS - UIImageView 动画 3.CADisplayLink 定时器 具体 ...
- 第二章 JavaScript核心语法
第二章 avaScript核心语法 一.变量的声明和赋值 JavaScript是一种弱类型语言,没有明确的数据类型,也就是在声明变量时不需要指定数据类型,变量的类型由赋给变量的值决定. 在Java ...
- css基本概念与css核心语法介绍
css基本概念 css是什么?不需要了解太多文字类介绍,记住css是层叠样式表,HTML是页面结构,css负责页面样式,javascrt负责静态页面的交互.CSS 能够对网页中元素位置的排版进行像素级 ...
- IOS 开发-- 常用-- 核心代码
网络请求 (包含block 和 delegate) 数据持久化技术 手势处理’ XML数据解析 多线程实现 核心动画编程 地图定位功能 CoreData数据持久化技术 本地通知和推送通知 常用宏定义 ...
- [php入门] 2、基础核心语法大纲
1 前言 最近在学PHP,上节主要总结了PHP开发环境搭建<[php入门] 1.从安装开发环境环境到(庄B)做个炫酷的登陆应用>.本节主要总结PHP的核心基础语法,基本以粗轮廓写,可以算作 ...
- 黑马程序员——OC语言 核心语法(2)
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)id 1)简介:万能指针,能指向任何OC对象,相当于NSObject ...
- 黑马程序员——OC语言 核心语法(1)
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)点语法 点语法其实本质上还是方法调用 当使用点语法时,编译器会自动展 ...
- IOS开发系列 --- 核心动画
原始地址:http://www.cnblogs.com/kenshincui/p/3972100.html 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥i ...
- iOS开发之核心动画(Core Animation)
1.概述 Core Animation是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍,使用它需要先添加QuartzCore.framework和引入对应的框架< ...
- iOS:CALayer核心动画层
CALayer:核心动画层 简介: Core Animation 是跨平台的,支持iOS环境和Mac OS X环境 学习核心动画之前,需要先理解CALayer,因为核心动画操作的对象不是UIView, ...
随机推荐
- C语言中一个替换 strcpy的极好的方法
在C语言中有个方法:strcpy() 使用时经常容易内存申请不足,或是没有申请内存导致,复制的时候报错,我新写了一个方法,弥补这个缺陷 char *strcpy1(char *strDes, char ...
- 20145206邹京儒《Java程序设计》第一周学习总结
20145206 <Java程序设计>第1周学习总结 教材学习内容总结 1.三大平台:Java SE.Java EE与Java ME.Java SE是各应用平台的基础,分为四个主要的部分: ...
- Git撤销提交和修改相关操作
团队开发中经常遇到错误删除文件,错误提交等情况,那么使用Git该如何正确的进行撤销和恢复呢? 一.增补提交 git commit –C HEAD –a --amend -C表示复用指定提交的提交留言, ...
- Ubuntu下调整swap分区的大小
转自:http://blog.chinaunix.net/uid-7573623-id-2048964.html 由于安装oracle 的时候,swap太小不能继续安装,于是想有什么方法在不不用安装o ...
- C语言中do...while(0)的妙用
在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语句: 通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错 ...
- Elasticsearch在Windows下的安装
下载Elasticsearch,地址:elasticsearch.org/download 下载jdk,百度搜索jdk下载即可 配置JAVA_HOME变量,配置方法在此文:http://jingyan ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- OCJP(1Z0-851) 模拟题分析(八)over
Exam : 1Z0-851 Java Standard Edition 6 Programmer Certified Professional Exam 以下分析全都是我自己分析或者参考网上的,定有 ...
- annotation-config 和 component-scan 的区别
<context:annotation-config> 和 <context:component-scan>是Spring Core里面的两个基础概念,每个使用者都有必要理解怎 ...
- Oracle【IT实验室】数据库备份与恢复之五:Flashback
Flashback在开发环境(有时生产环境的特殊情况下)是很有用的一个工具. 5.1 9i Flashback 简介 5.1.1 原理 当数据 update 或 delete ...