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
{
//方法体
}

说明:

  1. 类实现部分的类型必须和类借口部分的类名相同。用于表示这是同一个类的接口部分和实现部分。
  2. 类实现部分也可以在类名后使用 ":父类名" 来表示继承了某个父类,单一般没必要。
  3. 类实现部分也可声明自己的成员变量,但这些成员变量只能在当前类访问。

    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合成存取方法

  1. 在类接口部分使用@property指令定义属性。使用@property定义属性无需放在类接口的花括号里,直接放在@interface@end之间。@property指示符放在属性定义的最前面。
  2. 在类中实现的部分使用@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和类型间用括号的额外指示符

  1. assign 指定对属性只是简单赋值,不更改对所赋的值的引用计数。用于NSinteger及short float double 结构体等C数据类型
  2. atomic(nonatomic) 默认atomic,指定合成的方法是否为原子操作,当一个线程进入存取方法的方法体后,其他线程无法进入该存、去方法,避免多线程冰法破坏对象的完整性。
  3. copy 使用copy,当调用setter方法对成员变量赋值时,会将被赋值的对象复制一个副本,再讲该副本赋值给成员变量。
  4. gettersetter 用于为合成的getter、setter方法指定自定义方法名

    语法@property (assign,nonatomic,getter=wawa,setter=nana:) int price;
  5. readonly,readwrite(默认) ,readonly 指示系统只合成getter方法
  6. retain 属性赋值时,原来所引用的对象的引用计数器减1,被赋值的对象引用计数加1
  7. strong,weak 强引用、弱引用,强引用指向被赋值的对象,name对象就不会自动回收;弱引用指向的对象可能被回收
  8. unsafe_unretainedweak相似,unsafe_unretained所引用的对象被回收后,unsafe_unretained指针不会被赋值为nil,可能导致程序崩溃

4.5 点语法

Objective-C面向对象(一)的更多相关文章

  1. iOS开发核心语言Objective C —— 面向对象思维、setter和getter方法及点语法

    本分享是面向有意向从事iOS开发的伙伴们.或者已经从事了iOS的开发人员.假设您对iOS开发有极高的兴趣,能够与我一起探讨iOS开发.一起学习,共同进步.假设您是零基础,建议您先翻阅我之前分享的iOS ...

  2. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  3. 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

    一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...

  4. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  5. 浅谈Objective—C中的面向对象特性

    Objective-C世界中的面向对象程序设计 面向对象称程序设计可能是现在最常用的程序设计模式.如何开发实际的程序是存在两个派系的-- 面向对象语言--在过去的几十年中,很多的面向对象语言被发明出来 ...

  6. Objective-C面向对象-对象和类

    文章都是先由本人个人博客:孙占兴:www.teilim.com,先更新,随后CSDN博客才会更新,掌握第一动态请关注本人主站. 原文链接:http://www.teilim.com/objective ...

  7. Objective-C(面向对象的三大特性)

    封装 set方法 作用:提供一个方法给外界设置成员变量值,可以在方法里面进行过滤 命名规范 1. 方法名必须以set开头 2. set后面跟上成员变量的名称,成员变量的首字母必须大写 3. 返回值一定 ...

  8. Objective C笔记(第一天)

    • OC语言概述 1.早在20世纪80年代早期,Bard Cox发明了Objective C, 是扩充的C,面向对象的编程语言. 2.NEXTSTEP简称NS a.1985年,Steve Jobs成⽴ ...

  9. C++面向对象的编程

    C++面向对象的编程 目录 对C++面向对象编程的理解 声明和定义类 声明和定义 构造函数 析构函数 静态成员和静态变量 类实例化对象 对象的浅复制和深复制 继承 单继承 多继承 虚函数 类模板 其他 ...

  10. Objective-C面向对象的编程

    Objective-C面向对象的编程 目录 对面向对象编程思想的理解 类的声明和定义 类的声明和定义 对关键字super和self的理解 初始化函数 @property声明类成员 类的实例化 继承 组 ...

随机推荐

  1. C# 类型转换 Dictionary转Model类

    /// <summary> /// 把Model转换为DataRow /// </summary> /// <typeparam name="T"&g ...

  2. MySQL查询昨天、今天、7天、近30天、本月、上一月数据

    文章同步发表在博主网站朗度云,传输门:http://www.wolfbe.com/detail/201608/291.html   在开发或者统计时,我们可能需要统计某个表的数据.比如:查看今天新增的 ...

  3. 1.Mariadb(mysql)基本操作

    1.:安装与初始化 1)安装 yum install -y mariadb\* 2)初始化 systemctl restart mariadb systemctl enable  mariadb my ...

  4. js随机生成字母数字组合的字符串 随机动画数字

    效果描述: 附件中只有一个index.html文件有效 其中包含css以及html两部分内容 纯js生成的几个随机数字 每次都不重复,点击按钮后再次切换 使用方法: 1.将css样式引入到你的网页中 ...

  5. eclipse指定启动的jdk

    原文:http://my.oschina.net/noday/blog/203987 到eclipse目录,打开eclipse.ini文件,在指定位置加入你的jdk相关文件(如下面示例配置中-vm配置 ...

  6. FileUpload无法赋值解决方案

    FileUpload无法赋值解决方案 编写人:CC阿爸 2015-1-27 今天在这里,我想与大家一起分享如何处理fileupload控件不能赋值的问题.有兴趣的同学,可以一同探讨与学习一下,否则就略 ...

  7. Silverlight 使用IsolatedStorage新建XML文件,并且用LINQ查询XML

    代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...

  8. 获取php的配置

    ini_get — 获取一个配置选项的值 返回值 成功是返回配置选项值的字符串,null 的值则返回空字符串.如果配置选项不存在,将会返回 FALSE. <?php /* 我们的 php.ini ...

  9. 关键字替换排除HTML标签属性字符

    解决办法: 1.打开文件e/class/functions.php 2.找到函数 ReplaceKey($newstext,$classid=0) 3.找到替换代码 if(STR_IREPLACE) ...

  10. python分片

    刚刚学习,很新 >>> numbers = [1,2,3,4,5,6,7,8,9,10] >>> numbers[0:10:2] [1,3,5,7,9] >& ...