oc基本知识
(一)构造函数
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基本知识的更多相关文章
- iOS 阶段学习第11天笔记(OC基础知识)
iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import 用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...
- Swift 2.0 字符串学习笔记(建议掌握OC字符串知识的翻阅)
自己公司开现在使用OC语言在写,但Swift似乎是苹果更推荐使用的开发语言,估计也是未来开发的趋势,自己以前有接触swift,但又由于公司的项目赶,也没有时间去好好地学习这款开发语言.现在年底了,项目 ...
- Swift 基础部分(建议掌握OC字符串知识的翻阅)
更新说明: Swift 目前已经发布到4.0版本了,以前写的这整个Swift学习系列的文章,有很多的不足之处,我会重新整理整个系列文章,也是相当于重新复习一遍Swift,后面系列文章的改动之处全都会做 ...
- c和oc小知识
1.const const 修饰了*p1 / *p2 const int * p1=&age; int const * p2=&age;//和上面的意义一样 ,换句话说就是 在 “ * ...
- 开启Objective-C --- OC基础知识
一.Objective-C简述 Objective-C通常写作ObjC和较少用的Objective C或Obj-C,是扩充C的面向对象编程语言.Objective-C主要用于:编写iOS操作 ...
- oc 基础知识
一.枚举 结构体 typedef enum{ sexMan, sexWoman }Sex; tydedef struct{ int year; int month; int da ...
- OC - 2.OC基础知识介绍
一.基础语法 1> OC语言和C语言 C语言是面向过程的语言,OC语言是面向对象的语言 OC语言继承了C语言,并增加了面向对象的思想 以下内容只介绍OC语言与C语言的不同之处 2> 关键字 ...
- OC准备知识
#import 与 #include区别 include完成头文件的导入,可能会导致头文件的相互引用和函数或变量的重复定义 为了解决这个问题 我们必须这样做 #ifndef Student_h #de ...
- OC之知识储备篇
1. Objective-C是基于C语言的. a. 在C语言的基础之上新增了面向对象的语法. b. 将C语言中复杂的.繁琐的语法封装的更为简单. 2. Objective-C程序的源文件的后缀名.m ...
- 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. ...
随机推荐
- centos7下mongoDB安装和配置
2018-10-31更新 yum –y install mongodb-org 找不到这个包,清华源: https://mirrors.tuna.tsinghua.edu.cn/help/mongod ...
- ORM组件LogORM使用指北
LogORM是一个对数据库进行对象关系映射的ORM组件.当对数据库进行增删改操作时,组件会自动进行日志记录. 该组件支持.Net平台和.NetCore平台,支持SQL Server.Oracle.My ...
- JS思考遍历对象
var json={ “name”:”小明”, “age”:”10”, “sex”:”男” } for(var key in json); //key只是个变量名 console.log(key); ...
- Linux 常用解压和压缩命令
.tar 解包 tar xvf filename.tar.tar 打包 tar cvf filename.tar dirname.gz 解压1 gunzip filename.gz.gz 解压2 gz ...
- win10下,打开oracle时出现 oracle initialization or shutdown in process 错误 的解决办法
解决方法: 1)在dos窗口下输入:sqlplus /nolog 2)SQL>connect sys/sys as sysdba 提示:已连接. 3)SQL>shutdown normal ...
- Angular template ng-template/container/content
1. ng-template 形式:<ng-template>...</ng-template> 默认ng-template中的内容会隐藏; 可通过[ngIf]来控制内容显示隐 ...
- 【solved】must have one register DataBase alias named `default`
beego在初始化MySQL数据库时报错处理 1.报错提示: ... [ORM]2019/10/11 08:42:52 register db Ping `default`, dial tcp 192 ...
- js常用正则整理
个人博客: http://mcchen.club //校验是否全由数字组成 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.ex ...
- Java的动手动脑
动手动脑及课后实 仔细阅读示例: EnumTest.java,运行它,分析运行结果? public class EnumTest { public static void main(String[] ...
- Maven下载速度过慢问题已解决
因为Maven 默认仓库的服务器在国外所以我们国内的使用效果极差,我们可以修改成为国内镜像地址加速下载. 两种方法 修改全局文件 C:\Users\您电脑帐号\ .m2\settings.xml没有文 ...