• 第二章 Objective-C语言基础进阶

一、Objective-C语言写法简化

  • 利用@property快速生成setget方法

1、首先来复习一下setget写法,这是上一节笔记写的setget方法的User.h文件

 #import <Foundation/Foundation.h>

 @interface User : NSObject
{
NSString * _name; //定义字符串变量
NSString * _sex;
NSInteger _age; //定义整型变量
}
/*********setget方法*********/
/**定义set用户昵称的方法*/
- (void) setName:(NSString *) name;
/**定义get用户昵称的方法*/
- (NSString *)name;
/**定义set性别的方法*/
- (void) setSex:(NSString *) sex;
/**定义get性别的方法*/
- (NSString *)sex;
/**定义set年龄的方法*/
- (void) setAge:(NSInteger) age;
/**定义get年龄的方法*/
- (NSInteger)age; /*********其他方法*********/
/**定义声明类的方法*/
- (void) createMyClass;
@end //虽然这种写法简单易懂,条理分明,但是看起来模式化的语言结构是不是有些繁琐呢?笔者在刚接触OC的时候,也被setget方法烦到不行。但是万能的程序猿同学还是给出了一种方便又简捷的办法来书写setget方法。     

2、利用@property来简写setget方法

User.h文件:

 #import <Foundation/Foundation.h>

 @interface User : NSObject
@property NSString * name; //定义字符串变量
@property NSString * sex;
@property NSInteger age; //定义整型变量
/*********其他方法*********/
/**定义声明类的方法*/
- (void) createMyClass; @end //没错,这样我们就完成了Users这个类接口部分的编写!!

User.m文件:

 #import <Foundation/Foundation.h>
#import "User.h" @implementation User
/**声明类的方法*/
- (void) createMyClass{
NSLog(@"声明一个名为User的类");
} @end
//至此我们就完成了Users这个类实现部分的编写!!
12 //初学的同学一定是已经惊呆了,为什么可以这么简单。。。。。。笔者写到这回想昨天那段代码,对象三个属性就写的笔者泪流满面了。。。。。。。

>>使用@property请注意一下几个事项:

>>>1、使用@property时,父类名后边的花括号省略。

>>>2、使用@property时,会严格按照setget的写法自动生成setget方法对应的接口部分和实现部分,这就是为什么setget在书写的时候会有严格的要求。

>>>3、如果想要对setget生成的方法进行改写,只需要按照原来的要求与格式,在setget的实现部分进行更改就可以了。

  • 利用点语法给对象属性赋值

1、首先来复习一下上一篇中如何set方法给对象的属性赋值

 #import <Foundation/Foundation.h>
#import "User.h" //定义main方法,作为程序入口
int main(int argc,char *argv[])
{
@autoreleasepool //自动释放池
{
User * user1=[[User alloc]init]; //声明对象并开辟对象的内存空间
[user1 setName:@"Jereh"]; //调用set方法给字符串型变量name赋值
[user1 setSex:@"Male"]; //调用set方法给字符串型变量sex赋值
[user1 setAge:]; //调用set方法给整型变量sex赋值
[user1 createMyClass]; //调用createMyClass方法,打印“声明一个名为User的类”
NSLog(@"\n姓名:%@\n性别:%@\n年龄:%ld\n",[user1 name],[user1 sex],[user1 age]); //打印用户信息,User1后边的name,sex,age均使用了get方法来获取对象的属性
}
return ; //返回值
}

2、利用点语法给对象属性赋值的写法

 #import <Foundation/Foundation.h>
#import "User.h" //定义main方法,作为程序入口
int main(int argc,char *argv[])
{
@autoreleasepool //自动释放池
{
User * user1=[[User alloc]init];
user1.name=@"Jereh"; //点语法给对象user1的属性name赋值
user1.sex=@"Male"; //点语法给对象user1的属性sex赋值
user1.age=; //点语法给对象user1的属性age赋值
[user1 createMyClass];
NSLog(@"\n姓名:%@\n性别:%@\n年龄:%ld\n",user1.name,user1.sex,user1.age); //打印用户信息,使用点语法来获取对象的属性
}
return ; //返回值
}
  • 利用自定义构造方法来给对象赋值

1、首先来看一段代码

User.h文件:

 1 #import <Foundation/Foundation.h>
2
3 @interface User : NSObject
4 @property NSString * name; //定义字符串变量
5 @property NSString * sex;
6 @property NSInteger age; //定义整型变量
7 /*********其他方法*********/
8 /**定义声明类的方法*/
9 - (void) createMyClass;
10 - (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age; //定义一个自定义构造方法,注意返回值类型和方法格式的书写
11
12 @end    

User.m文件:

 #import <Foundation/Foundation.h>
#import "User.h" @implementation User:NSObject
/**声明类的方法*/
- (void) createMyClass{
NSLog(@"声明一个名为User的类");
}
- (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age{
self = [super init]; //关于self和super详细解惑请参考:http://www.cnblogs.com/tangbinblog/p/4034890.html
if (self) {
_name=name;
_sex=sex;
_age=age;
}
return self;
}
@end

main.m文件:

 #import <Foundation/Foundation.h>
#import "User.h" //定义main方法,作为程序入口
int main(int argc,char *argv[])
{
@autoreleasepool //自动释放池
{
User * user1=[[User alloc]initWithName:@"Jereh" andSex:@"Male" andAge:]; //自定义构造方法调用,替代init直接输入变量
[user1 createMyClass];
NSLog(@"\n姓名:%@\n性别:%@\n年龄:%ld\n",user1.name,user1.sex,user1.age); //打印用户信息,使用点语法来获取对象的属性
}
return ; //返回值
}

输出结果:

2、自定义构造方法使用注意事项

>>>1、在.h文件中,定义自定义构造方法时,返回值类型一般为instancetype,声明方法开头必须以initWithXxx:开始,严格按照驼峰法则命名。若需要同时声明多个属性的初始化,中间则必须用andXxxx连接,且必须使用驼峰法则命名。

>>>2、在.m文件中,实现自定义构造方法时,花括号里面的格式是固定的,其中self指的是当前对象的指针,[super init]意思是调用父类NSObject中的init方法返回一个初始化好的对象给self,加if判断当前对象不为空时,给当前对象的属性赋值,最后再把赋值好的对象返回给你在main.m中初始化的对象名称。

>>>3、自定义构造方法调用时,必须按照要求的格式进行书写,变量和变量类型必须匹配。

二、类方法和对象方法

  • 类方法和对象方法的书写

1、首先先看下面的程序段:

User.h文件:

 #import <Foundation/Foundation.h>

 @interface User : NSObject
@property NSString * name;
@property NSString * sex;
@property NSInteger age;
/**声明对象方法 */
- (void) createMyClass;
/**声明类方法 */
+ (void) createMyClass;
/**声明一个自定义构造方法方法 */
- (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age;
@end

User.m文件:

#import <Foundation/Foundation.h>
#import "User.h" @implementation User:NSObject
/**声明类的方法*/
- (void) createMyClass{
NSLog(@"这是对象方法输出的结果");
}
/**声明类方法 */
+ (void) createMyClass{
NSLog(@"这是类方法输出的结果");
}
/**实现自定义构造方法 */
- (instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAge:(NSInteger)age{
self = [super init];
if (self) {
_name=name;
_sex=sex;
_age=age;
}
return self;
}

main.m文件:

#import <Foundation/Foundation.h>
#import "User.h" //定义main方法,作为程序入口
int main(int argc,char *argv[])
{
@autoreleasepool //自动释放池
{
User * user1=[[User alloc]initWithName:@"Jereh" andSex:@"Male" andAge:];
[user1 createMyClass];
[User createMyClass];
}
return ; //返回值
}

输出结果:

2、对象方法和类方法的异同

>>对象方法书写格式

>>>无返回值无参数的对象方法 -(void)方法名;

>>>无返回值有参数的对象方法 -(void)方法名:(参数类型)参数名;

>>>有返回值无参数的对象方法 -(返回值类型)方法名;

>>>有返回值有参数的对象方法 -(返回值类型)方法名:(参数类型)参数名;

>>对象方法调用

>>>[调用对象 对象方法名]

>>类方法书写格式

>>>无返回值无参数的类方法 +(void)方法名;

>>>无返回值有参数的类方法 +(void)方法名:(参数类型)参数名;

>>>有返回值无参数的类方法 +(返回值类型)方法名;

>>>有返回值有参数的类方法 +(返回值类型)方法名:(参数类型)参数名;

>>类方法调用

>>>[调用类 类方法名]

  • 关于类方法和对象方法的使用

1、类方法是属于整个类的方法,而不属于某个对象,所以单个对象无法调用类方法

2、类方法无需定义成员变量就可以实现,但无法访问成员变量,即系统只会调用类方法,不会调用对象方法

3、类方法效率较高

4、对象方法必须有对象才可以实现

5、类方法不能被覆盖,对象方法则可以被覆盖

6、类方法的适用场合

>>1、当初始化对象的时候可以使用类方法
          >>2、当该方法涉及不到成员变量的时候可以使用类方法
          >>3、封装一些工具类的时候可以使用类方法

IOS学习笔记 O2的更多相关文章

  1. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  2. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

  3. IOS学习笔记之关键词@dynamic

    IOS学习笔记之关键词@dynamic @dynamic这个关键词,通常是用不到的. 它与@synthesize的区别在于: 使用@synthesize编译器会确实的产生getter和setter方法 ...

  4. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  5. iOS学习笔记10-UIView动画

    上次学习了iOS学习笔记09-核心动画CoreAnimation,这次继续学习动画,上次使用的CoreAnimation很多人感觉使用起来很繁琐,有没有更加方便的动画效果实现呢?答案是有的,那就是UI ...

  6. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  7. iOS学习笔记之Category

    iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...

  8. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

  9. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

随机推荐

  1. SVN-修改已提交的日志

    前提:服务器是Windows下的VisualSVN Server 1.在库的属性页面的Hooks选项卡下找到Pre-revision property change hook,2.双击修改其内容,具体 ...

  2. 笔记007:对象——RegExp正则表达式对象

    1.RegExp 一个用于匹配的模式文本 用0个或多个修饰符描述的匹配模式细节 RegExp对象的创建形式 用内建构造器创建    var re = new RegExp("j.*t&quo ...

  3. awk 统计出现次数--转

    知识点: 1)数组 数组是用来存储一系列值的变量,可通过索引来访问数组的值. Awk中数组称为关联数组,因为它的下标(索引)可以是数字也可以是字符串. 下标通常称为键,数组元素的键和值存储在Awk程序 ...

  4. SQL Server中 ldf 文件过大的解决方法

    在SQL Server中经常遇到事务日志变大的情况,除了将数据库设置为"自动收缩"外,还可以使用下面的SQL命令进行快速清除数据库中的事务日志,命令如下:  - 第一步:清空日志  ...

  5. Button四角有弧度及按下显示不同的颜色

    一般的button都是矩形或者正方形,但为了显示不同的效果,让界面更美化,可以对其进行处理!!! 1.四角有弧度的button 2.按下button显示不同的颜色 实现步骤: 首先在drawable文 ...

  6. 去除inline-block元素间间距的N种方法

    这篇文章发布于 2012年04月24日,星期二,22:38,归类于 css相关. 阅读 147771 次, 今日 52 次 by zhangxinxu from http://www.zhangxin ...

  7. JS Encode and Decode URL

    1.Encode URL String var url = $(location).attr('href'); //get current url //OR var url = 'folder/ind ...

  8. OO基本原则

    1. 单一职责原则(SRP)     一个类应该最多只能有一个因素能够给导致其变化,类中的方法应该都是相关性很高的,即"高内聚"   2. 开放-封闭原则(OC)      - 扩 ...

  9. android studio serialversionuid设置

  10. SVN服务器搭建之提交日志模版构建

    SVN服务器搭建之提交日志模版构建 日志提交有两种 一种是自己客户端设置提交日志模版,这个只适用于自己,没办法强制性运用到项目中,只能依照每个人的自觉性来处理. 第二种方法是SVN服务器设置提交日志模 ...