Objective-C面向对象(一)
1.类和对象
1.1定义类
面向对象的程序设计中有两个重要概念:类(class)和对象(object),类事某一批对象的抽象,对象是一个具体存在的实体。
Objective-C定义类需要氛围2个步骤
- 接口部分 :定义该类包含的成员变量和方法。
- 实现部分 :为该类的方法提供实现。
定义接口部分的语法:
@interface MyClass:NSObject
{
int _count;
id _data;
NSString* _name;
}
-(id)initWithString:(NSString*)aName;
+(MyClass*)createMyClassWithString:(NSString* aName);
@end
@interface用于声明定义类的接口部分,@end表明定义结束。其后紧跟该类d一对花括号用于声明该类的成员变量;花括号后面的部分用于声明该类的方法。定义类的接口声明部分防灾头文件中。
- 成员变量:用于描述该类的对象的状态数据
- 方法:用于描述该类的行为
定义成员变量
类型 成员变量名;
声明方法:
- (void)insertObject:(id)anObject atIndex:(NSUInteger)index
方法类型标识:+ 或者- ,+代表该方法是类方法,直接类型即可调用;-代表该方法是实例方法,必须对象才能调用。
返回值类型:可以是OC允许的任何数据类型。
方法签名关键字:由方法名,行参标签和冒号组成。OC建议为后面的每个行参都指定一个行参标签,该行参标签可以很好的说明该行参的作用。
Objective-C的方法声明中,所有的类型(包括void)都应该使用圆括号括起来。
定义实现部分的语法:
@implementation MyClass
{
int _count;
id _data;
NSString* _name;
}
-(id)initWithString:(NSString*)aName
{
//方法体
}
+(MyClass*)createMyClassWithString:(NSString*)aName
{
//方法体
}
说明:
- 类实现部分的类型必须和类借口部分的类名相同。用于表示这是同一个类的接口部分和实现部分。
- 类实现部分也可以在类名后使用 ":父类名" 来表示继承了某个父类,单一般没必要。
- 类实现部分也可声明自己的成员变量,但这些成员变量只能在当前类访问。
4.类实现部分必须为类声明部分的每个方法提供方法定义。
1.2对象的产生和使用
定义变量: 类名* 对象名
创建对象: [[类名 alloc] 初始化方法]
alloc是OC的关键字,负责为类分配内存空间,创建对象,调用初始化方法对该实例执行初始化。所有的对象都继承类NSObject ,所有的类都有一个默认的初始化方法:init.
也可以使用new创建对象 [类名 new]
OC调用方法的语法为:[调用者 方法名:参数 行参标签:参数值 ...]
1.3 self
self关键字总是指向调用该方法的对象。self关键字最大的作用是让类中的一个方法访问该类中另一个方法或者成员变量。
#import <Foundation/Foundation.h>
@interface FKWorf:NSObject
{
NSString* _name;
}
-(void) setName:(NSString*)_name;
-(void) info;
@end
@implementation FKWorf
-(void) setName:(NSString*) n
{
self->_name = n;
}
-(void) info
{
NSLog(@"我是%@",self->_name);
}
@end
int main(int argc, char const *argv[])
{
@autoreleasepool
{
FKWorf* worf = [[FKWorf alloc] init];
[worf info];
}
return 0;
}
1.4 id类型
任意类型的对象都可复制给id类型的变量
id p = [[FKWorf alloc] init];
[p info];
2.方法详解
OC中方法的所属性:
- 方法不能独立定义,只能定义在类中
- 从逻辑意义上看,方法要么属于该类本身(+),要么属于该类的一个对象(-)
- 永远不能独立执行方法,执行方法必须使用类或对象作为调用者
2.1 形参个数可变的方法
定义方法时,在最后一个形参后增加逗号和三点(,...),则表明该形参可以接受多个参数值。
长度可变的形参只能处于形参列表的最后,一个方法中最多只能包含一个长度可变的形参。
定义语法:-(void)test:(NSString*)name,...
获取形参:
- va_list,定义指向可变参数列表的指针
- va_start,函数,制定开始处理可变形参的列表,并让指针指向可变形参列表的第一个参数
- va_end,结束处理可变形参,释放指针变量
- va_arg,该函数范湖获取指针当前指向的参数的值,并将指针指向下一个参数
-(void)test:(NSString*)name,...
{
va_list argList;
//如果第一个name参数存在,才需要处理后面的参数
if(name)
{
NSLog(@"%@",name);
va_start(argList,name);
NSString* arg = va_arg(argList,id);
while(arg)
{
NSLog(@"%@",arg);
arg = va_arg(argList,id);
}
va_end(argList);
}
}
3.成员变量
成员变量指的是在类接口部分或类实现部分定义的变量,OC的成员变量都是实例变量。
访问实例变量 实例->实例变量
声明实例变量,系统会为实例变量执行默认初始化,基本类型的实例变量默认被初始化为0,指针类型的成员变量默认被初始化nil
4.隐藏和封装
4.1封装
封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息 ,而是通过该类提供的方法类实现对内部信息的操作和访问。
4.2 访问控制符
4个访问控制符:@private,@package,@protected,@public
4.3 @package 访问控制符
@package修饰的成员变量,可以在当前类和同一镜像的中访问,同一镜像是指,编译后生成的同一个框架或同一个执行文件
4.4合成存取方法
- 在类接口部分使用
@property指令定义属性。使用@property定义属性无需放在类接口的花括号里,直接放在@interface、@end之间。@property指示符放在属性定义的最前面。 - 在类中实现的部分使用
@synthesize指令声明该属性。
以上步骤会合成成对的setter和getter方法,还会自动在类实现部分定义一个与getter方法同门的成员变量。
使用@syethesize的语法格式 @sythesize property名[=成员变量名]
#import <Foundation/Foundation.h>
@interface FKUser:NSObject
@property (nonatomic) NSString* name;
@property NSString* pass;
@property NSDate* birth;
//-(void)setName:(NSString*) name;
@end
@implementation FKUser
@synthesize name=_name;
@synthesize pass;
@synthesize birth;
-(void)setName:(NSString*) name
{
self->_name=[NSString stringWithFormat:@"+++%@",name];
}
@end
int main(int argc, char const *argv[])
{
FKUser* user=[[FKUser alloc] init];
[user setName:@"唐僧"];
[user setPass:@"1234"];
[user setBirth:[NSDate date]];
NSLog(@"name=%@,pass=%@,birth=%@",[user name],[user pass],[user birth]);
return 0;
}
@property和类型间用括号的额外指示符
assign指定对属性只是简单赋值,不更改对所赋的值的引用计数。用于NSinteger及short float double 结构体等C数据类型atomic(nonatomic) 默认atomic,指定合成的方法是否为原子操作,当一个线程进入存取方法的方法体后,其他线程无法进入该存、去方法,避免多线程冰法破坏对象的完整性。copy使用copy,当调用setter方法对成员变量赋值时,会将被赋值的对象复制一个副本,再讲该副本赋值给成员变量。getter、setter用于为合成的getter、setter方法指定自定义方法名
语法@property (assign,nonatomic,getter=wawa,setter=nana:) int price;readonly,readwrite(默认) ,readonly 指示系统只合成getter方法retain属性赋值时,原来所引用的对象的引用计数器减1,被赋值的对象引用计数加1strong,weak强引用、弱引用,强引用指向被赋值的对象,name对象就不会自动回收;弱引用指向的对象可能被回收unsafe_unretained与weak相似,unsafe_unretained所引用的对象被回收后,unsafe_unretained指针不会被赋值为nil,可能导致程序崩溃
4.5 点语法
Objective-C面向对象(一)的更多相关文章
- iOS开发核心语言Objective C —— 面向对象思维、setter和getter方法及点语法
本分享是面向有意向从事iOS开发的伙伴们.或者已经从事了iOS的开发人员.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基础,建议您先翻阅我之前分享的iOS ...
- 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态
一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...
- 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射
一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- 浅谈Objective—C中的面向对象特性
Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...
- Objective-C面向对象-对象和类
文章都是先由本人个人博客:孙占兴:www.teilim.com,先更新,随后CSDN博客才会更新,掌握第一动态请关注本人主站. 原文链接:http://www.teilim.com/objective ...
- Objective-C(面向对象的三大特性)
封装 set方法 作用:提供一个方法给外界设置成员变量值,可以在方法里面进行过滤 命名规范 1. 方法名必须以set开头 2. set后面跟上成员变量的名称,成员变量的首字母必须大写 3. 返回值一定 ...
- Objective C笔记(第一天)
• OC语言概述 1.早在20世纪80年代早期,Bard Cox发明了Objective C, 是扩充的C,面向对象的编程语言. 2.NEXTSTEP简称NS a.1985年,Steve Jobs成⽴ ...
- C++面向对象的编程
C++面向对象的编程 目录 对C++面向对象编程的理解 声明和定义类 声明和定义 构造函数 析构函数 静态成员和静态变量 类实例化对象 对象的浅复制和深复制 继承 单继承 多继承 虚函数 类模板 其他 ...
- Objective-C面向对象的编程
Objective-C面向对象的编程 目录 对面向对象编程思想的理解 类的声明和定义 类的声明和定义 对关键字super和self的理解 初始化函数 @property声明类成员 类的实例化 继承 组 ...
随机推荐
- python发邮件遇到的端口号问题
在学习使用python发邮件的过程中, 遇到了一个问题:由于测试的时候使用的是QQ邮箱,要求必须使用SSL/TLS加密,所以有了下面的代码, from email.mime.text import M ...
- Linux下tftp安装与配置
1. 背景 开发板在u-boot下从pc获取文件的方式有三种: 1)dnw传输:http://www.cnblogs.com/tanghuimin0713/p/3614768.html 2)串口传输: ...
- JavaScript根据CSS的Media Queries来判断浏览设备的方法
CSS 部分 首先随便新建一个用来做判断的类,然后通过 Media Queries 来对这个类的 z-index 属性赋予不同的值.这个类仅作为 JavaScript 读取使用,所以需要将其移出屏幕窗 ...
- 简单实现兼容各大浏览器的js复制内容到剪切板
因为网站文章需要提供几个按钮,单击后实现复制文章内容到剪贴板. 在网上搜索了很多内容,发现都比较乱这里自己整理下,分享给大家 效果图如下: 之前使用的是window.clipboardData.set ...
- 后缀为inc的是什么文件?C#中如何包含inc文件?
在项目Web页面文件中,发现这么一句话: <!-- 页面字符集设置 begin--><!-- #INCLUDE FILE="http://www.cnblogs.com/C ...
- Ubuntu12.04卡死的解决方案
刚开始安装的时候用着还行,不过后来发现用了一会总是会出现卡死的状况 后来看了下ubuntu12.04的内核是3.2,后来把内核升级到3.5发现这种情况不会出现了. 查看内核以及升级内核 uname - ...
- 利用java读写Excel文件
一.读取Excel文件内容 java 代码 public static String readExcel(File file){ StringBuffer sb = new StringBuffer( ...
- 状态可以通过动画切换的按钮--第三方开源--TickPlusDrawable
Android tickplusdrawable(TickPlusDrawable)在github上的项目主页是:https://github.com/flavienlaurent/tickplusd ...
- 修改后的SQL分页存储过程,利用2分法,支持排序
/****** Object: StoredProcedure [dbo].[sys_Page_v3] Script Date: 08/13/2014 09:32:28 ******/ SET ANS ...
- 用VBA计算WPS 表格ET EXCEL中的行数和列数的多重方法
用VBA计算WPS 表格ET EXCEL中的行数和列数 每种方法中上面的是Excel的行数,下面的是Excel的列数. 方法1: ActiveSheet.UsedRange.Rows.Count Ac ...