• 第二章 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. DSP中的段

    虽然,C语言是一种相对高效的高级语言,并且TI提供的C编译器还结合硬件特点支持三级优化功能,但生成的汇编代码效率仍可能会不尽人意.如作者预使用环型缓冲区管理功能,这就要求该缓冲区应被定位到相对特定的位 ...

  2. 3D旋转相册(适合新手)

    <!DOCTYPE HTML> <html onselectstart="return false"> <head> <meta char ...

  3. MySQL常见错误及其解决办法

    1.连接类 (1).问题:MySQL server has gone away  解决办法:出现该报错常见的原因是服务器超时了并且关闭了连接.缺省地,如果没有事情发生,服务器在 8个小时后关闭连接.如 ...

  4. Angularjs学习笔记(三)----依赖注入

    一.定义 如前所述,$scope对象被神秘的注入到了控制器中,实际上,这是因为控制器声明了它需要$scope,所以AngularJS才会创建并注入它.这套依赖管理系统可以这样总结:"为了正常 ...

  5. R常见的几种常见统计图

    1,向日葵散点图 2,热图  (颜色越深,数值越大) 3,折线图(散点图),绘制散点图集用 paris(data.frame)

  6. Node.js intro

    1. require() load module http://stackoverflow.com/questions/9901082/what-is-this-javascript-require ...

  7. nginx重启

    ps aux | grep nginx 查找 主进程 号 kill 9666 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.co ...

  8. code project 上的内存管理的示例代码

    /******************************************************************** created: 2014/03/17 18:53 file ...

  9. 【循序渐进MVC】第一回——一物多用Project.json依赖关系之dependencies节点

    Project.json统一了ASP.NET vNext之前版本的packages.config.NuGet 配置(nuspec)以及项目文件(csprojs):并集成在Project.json中. ...

  10. mouseChildren启示

    将aSprite的 mouseChildren 属性设置为 false ,可以实现mouseClick 事件的目标为 aSprite对象,而不是其子对象中的任一个.