(一)构造函数

h文件

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
NSString *_name;
NSString *_id;
} -(instancetype) initWithName:(NSString *)name ID:(NSString *) idNum; -(void) showInfo; @end

m文件

#import "Student.h"

@implementation Student

-(instancetype) initWithName:(NSString *)name ID:(NSString *) idNum
{
if([super init])
{
_name=name;
_id=idNum;
} return self;
} -(void) showInfo
{
NSLog(@"Student name:%@,id:%@",_name,_id);
} @end

调用

#pragma 构造函数
Student *s=[ [Student alloc] initWithName:@"Andy" ID:@""];
[s showInfo];

(二)block

block为可以实现特定功能的模块,跟C#中采用lamda表达式定义的委托相似

block定义

typedef int (^BlockDef)(int,int);

block使用

#pragma block 类似C#中用lamd定义的委托
BlockDef sumBlock=^(int a,int b)
{
return a+b;
};
NSLog(@"Block get sum:%d",sumBlock(,));

(三)协议protocol

类似于C#中的接口

定义,protocol只需要定义方法,在继承此协议的类中去实现

@protocol MyProtocol <NSObject>

@required//必须实现
-(void) method1;
-(void) method2; @optional//可以不实现
-(void) method3; @end

定义一个类去继承上述协议并实现此协议

#import <Foundation/Foundation.h>
#import "MyProtocol.h" @interface Worker : NSObject <MyProtocol> @end
#import "Worker.h"

@implementation Worker

-(void)method1
{
NSLog(@"Protocol method1");
} -(void)method2
{
NSLog(@"Protocol method2");
}
@end

使用

#pragma protocol 类似接口
Worker *w = [Worker new];
[w method1];
[w method1];

(四)分类

通过分类可以实现方法的扩展,扩展原生的类,可以实现增加方法,方便协作,如下类为person类,通过PersonPP(文件名)对其进行分类扩展,语法为Person(分类名)

Person.h

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
NSString *test;
@public
NSString *_name;
NSString *_num;
} @end

Person.m

#import "Person.h"

@implementation Person

//-(void) dealloc
//{
// NSLog(@"Dealloc");
// [super dealloc];s
//} //-(void) push
//{
//NSLog(@"Extented %@ push",_name);
//} @end

PersonPP.h

#import <Foundation/Foundation.h>
#import "Person.h" @interface Person(plus) -(void) punch; @end

PersonPP.m

#import "PersonPP.h"

@implementation Person(plus)

-(void) punch
{
NSLog(@"Person %@ punched",_name);
} @end

main中调用

#pragma 分类:创建类的一个分支(扩展原类),可以访问原来类的公共变量,具有可继承性
Person *p=[Person new];
p->_name=@"Andy";
[p punch];//Person.h中无此方法,痛殴PersonPP.h扩展了Person类

(五)扩展类

类扩展与分类类似,类扩展只要扩展头文件即可,方法在原类中实现,还是以上述(四)中的Person类为例,语法为Person()

扩展头文件PersonExt.h

#import <Foundation/Foundation.h>
#import "Person.h" @interface Person()
{
@public
int _age;
} -(void) push; @end

扩展头文件中,增加了push方法,所以在person.m中可以直接实现,见(四)中Person.m中注视掉的push方法

#pragma 类扩展 类名 +()
//第一种扩展方法:新建头文件PersonExt.h,定义扩展方法,在Person.m中实现此方法,此时p1可访问PersonExt.h中的变量
Person *p1=[Person new];
p1->_name=@"Andy";
[p1 push];
//第er种扩展方法:将文件PersonExt.h内容直接写入Person.m中,并在Person.m中实现扩展方法,此时p1无法访问PersonExt.h中的变量

//-----------main.m----------------//

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Student.h"
#import "Person.h"
#import "Worker.h"
#import "PersonPP.h"
#import "PersonExt.h" typedef int (^BlockDef)(int,int); int main(int argc, char * argv[]) {
@autoreleasepool { #pragma 构造函数
Student *s=[ [Student alloc] initWithName:@"Andy" ID:@""];
[s showInfo]; #pragma 计数器(自动释放内存模式不做处理)
//Person *p=[Person new];
//NSLog(@"Count:%lu",p.retainCount);
//[p release];
#pragma block 类似C#中用lamd定义的委托
BlockDef sumBlock=^(int a,int b)
{
return a+b;
};
NSLog(@"Block get sum:%d",sumBlock(,)); #pragma protocol 类似接口
Worker *w = [Worker new];
[w method1];
[w method1]; #pragma 分类:创建类的一个分支(扩展原类),可以访问原来类的公共变量,具有可继承性
Person *p=[Person new];
p->_name=@"Andy";
[p punch];//Person.h中无此方法,痛殴PersonPP.h扩展了Person类 #pragma 类扩展 类名 +()
//第一种扩展方法:新建头文件PersonExt.h,定义扩展方法,在Person.m中实现此方法,此时p1可访问PersonExt.h中的变量
Person *p1=[Person new];
p1->_name=@"Andy";
[p1 push];
//第er种扩展方法:将文件PersonExt.h内容直接写入Person.m中,并在Person.m中实现扩展方法,此时p1无法访问PersonExt.h中的变量 return ;
//return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

oc基本知识的更多相关文章

  1. iOS 阶段学习第11天笔记(OC基础知识)

    iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import  用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...

  2. Swift 2.0 字符串学习笔记(建议掌握OC字符串知识的翻阅)

    自己公司开现在使用OC语言在写,但Swift似乎是苹果更推荐使用的开发语言,估计也是未来开发的趋势,自己以前有接触swift,但又由于公司的项目赶,也没有时间去好好地学习这款开发语言.现在年底了,项目 ...

  3. Swift 基础部分(建议掌握OC字符串知识的翻阅)

    更新说明: Swift 目前已经发布到4.0版本了,以前写的这整个Swift学习系列的文章,有很多的不足之处,我会重新整理整个系列文章,也是相当于重新复习一遍Swift,后面系列文章的改动之处全都会做 ...

  4. c和oc小知识

    1.const const 修饰了*p1 / *p2 const int * p1=&age; int const * p2=&age;//和上面的意义一样 ,换句话说就是 在 “ * ...

  5. 开启Objective-C --- OC基础知识

    一.Objective-C简述      Objective-C通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言.Objective-C主要用于:编写iOS操作 ...

  6. oc 基础知识

    一.枚举 结构体 typedef enum{ sexMan, sexWoman }Sex;   tydedef struct{    int year;    int month;    int da ...

  7. OC - 2.OC基础知识介绍

    一.基础语法 1> OC语言和C语言 C语言是面向过程的语言,OC语言是面向对象的语言 OC语言继承了C语言,并增加了面向对象的思想 以下内容只介绍OC语言与C语言的不同之处 2> 关键字 ...

  8. OC准备知识

    #import 与 #include区别 include完成头文件的导入,可能会导致头文件的相互引用和函数或变量的重复定义 为了解决这个问题 我们必须这样做 #ifndef Student_h #de ...

  9. OC之知识储备篇

    1. Objective-C是基于C语言的. a. 在C语言的基础之上新增了面向对象的语法. b. 将C语言中复杂的.繁琐的语法封装的更为简单. 2. Objective-C程序的源文件的后缀名.m  ...

  10. OC基础知识总结 分类: ios学习 OC 2015-06-26 17:58 58人阅读 评论(0) 收藏

    //OC: Objective-C, 面向对象的C语言 //OC与C的区别 //1.OC是C的超集, C语言的所有语法都可以在OC中使用 //2.OC是面向对象 //3.OC是一门运行时语言 //4. ...

随机推荐

  1. Maven项目运行报错提示找不到加载主类

    遇到这个问题花了几小时时间看网上的各种解决方法.试了几种都没用,最后用了这种本办法. 亲测第三条 https://blog.csdn.net/yuliantao/article/details/766 ...

  2. PHPstorm出现的端口号错误问题(502)

    咔咔咔-听好 PhpStorm的默认端口是63342,但是在浏览器会提示502错误. 同时Phpstorm右下角会报错:Please ensure that configured PHP Interp ...

  3. linux&shell学习系列

    1.VMware安装Centos7虚拟机 2.Linux之vim详解 3.linux后台运行的几种方式 4.linux权限管理 5.linux之用户和用户组管理详解 6.grep文本搜索工具详解 7. ...

  4. C语言入门-数组

    今天十月一日,上午看阅兵激情澎湃,但是下午还是要继续写C语言,前面的这块很简单 int number[100]; scanf("%d" , &number[i]); 一.定 ...

  5. for for in 给已有的li绑定click事件生成新的li也有click事件

    想要给已有的li元素绑定一个click事件,点击生成新的li元素,并且新的li元素也要有click事件 //不能用for循环给每个li绑定click事件 因为这样的话 后面新生成的li就没有click ...

  6. js数组的增删改查

    array 数组的增删改: push 从数组后面推入一个元素或多个元素 var arr = [1,2,3]; ​ // 返回:修改后数组的长度 arr.push(4,5,6); pop 删除数组最后一 ...

  7. cat命令显示文件指定行

    cat filename | tail -n 100 显示文件最后100行 cat filename | head -n 100 显示文件前面100行 cat filename | tail -n + ...

  8. Thinkphp5.0第五篇

    原样输出 使用literal标签防止模板标签被解析 例如 {literal} {$name}<br/> {/literal} 模板单行注释 {//注释内容} 多行注释 {/*注释内容*/} ...

  9. 使用LitePal建立表关联

    关联关系的基础知识   喜欢把所有的代码都写在一个类里的程序员肯定是个新手.没错,任何一个像样的程序都不可能仅仅只有一个类的,同样地,任何一个像样的数据库也不可能仅仅只有一张表.我们都知道,在面向对象 ...

  10. 从0开始学FreeRTOS-(列表&列表项)-6

    # FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像. 在FreeRTOS中,列表与列表项使用得非常多,是Free ...