• 第二章 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. html5 自定义验证信息

      h5 为表单新增了很多类型,及属性. 根据这些新增的类型及属性 h5也为我们提供了验证这些数据的js函数,这些验证表单的函数都存在了ValidityState对象中,接下来让我们一起来了解一下这些 ...

  2. C# 模拟键盘操作--SendKey(),SendKeys()

    模拟键盘输入就是使用以下2个语法实现的.SendKeys.Send(string keys);  //模拟汉字(文本)输入SendKeys.SendWait(string keys); //模拟按键输 ...

  3. WebBrowser打开Word文档的一些注意事项

    WebBrowser打开Word文档的一些注意事项 分类: C#word2010-03-31 21:26 5640人阅读 评论(3) 收藏 举报 webbrowser文档browser工具object ...

  4. 对dijkstra算法的自我理解,c#例子

    dijkstra该算法主要应用在求解最短路径,从最近点开始,广度搜索. 假设有向图中有10个顶点,求其中某个顶点a到其它顶点的最短路径..满足贪心算法的2个标准.时间复杂度为O(N2) 此问题可以进行 ...

  5. 驱动开发学习笔记. 0.04 linux 2.6 platform device register 平台设备注册 1/2 共2篇

    驱动开发读书笔记. 0.04  linux 2.6 platform device register 平台设备注册  1/2 共2篇下面这段摘自 linux源码里面的文档 : Documentatio ...

  6. windows与linux之间文件的传输方式总结(转)

    当然,windows与linux之间文件的传输的两种方式有很多,这里就仅仅列出工作中遇到的,作为笔记: 方法一:安装SSH Secure Shell Client客户端 安装即可登录直接拖拉到linu ...

  7. PTA Sort Three Distinct Keys

    Suppose you have an array of N elements, containing three distinct keys, "true", "fal ...

  8. 冷门JS技巧

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  9. ELK:kibana使用的lucene查询语法【转载】

    kibana在ELK阵营中用来查询展示数据 elasticsearch构建在Lucene之上,过滤器语法和Lucene相同 全文搜索 在搜索栏输入login,会返回所有字段值中包含login的文档 使 ...

  10. jQuery停止动画——stop()方法的使用

    很多时候需要停止匹配元素正在进行的动画,比如,当鼠标选入元素时显示菜单,鼠标离开时隐藏下拉菜单,如果鼠标移入移出过快的话就会导致动画效果与鼠标的动作不一致的情况,此时stop()就派上用场了. sto ...