从零开始:iOS(三)
整理一些Objective-c相关知识.
c#与objective-c对照着看,一步一步来.重点在oc上.
1:新建类.
/*C#*/public class Person{private string name;public string GetName(){return name;}public void SetName(string value){name = value;}public static void SayHello(){ /*print hello*/}}
/*o-c*//*.h*/ #import <Foundation/Foundation.h> @interface Person : NSObject {@private NSString *name; }-(NSString *) getName;-(void) setName:(NSString *) value;+(void) sayHello; @end/*.m*/ #import "Person.h"@implementation Person -(NSString *) getName{return name; } -(void) setName:(NSString *) value{if(name != value){[name release];name = [value retain];} } +(void) sayHello{NSLog(@"Hello"); } @end
{...}即是成员变量,也可以使用@private @public @protected
来指定访问级别. 如果不加,默认是protect.方法默认就是public,你在xcode里也@不出来访问修释符.
- 方法前加减号,表示这个方法是对象方法, + 方法前加加号,表示这个方法是类方法, c#同学可以感受下.
2:Two Stage Creation 两段构造模式.
/*C#*/ Person p = new Person(); //创建一个实例
/*oc*/ Person *p = [[Person alloc] init]
oc在构建对象的时候采用的是两段构造. 先调用了(+) alloc方法, 再调用(-) init方法 alloc分配内存空间,init负责初始化值. 再另写一个 对比下.那就秒懂了,其实就这点事.理解很容易.
/*C# 添加构造函数*/ public Person() {} public Person(string name) {this.name = name; } /*C# 构建对象*/ Person p = new Person("New Name");
/*oc 这里只写出 .m的实现,*/ -(id) initWithName:(NSString *)value{self = [super init];if(self){[name release];name = [value retain];} return self; }/*oc 构建对象*/ Person p = [[Person alloc] initWithName:@"New Name"];
-(id) 表示返回的是一个指针(不习惯就叫对象吧),self等同于 c#里的 this.
init没啥好说的,深入alloc一点吧.
这里引用http://blog.devtang.com/blog/2013/01/13/two-stage-creation-on-cocoa/该blog的一段文字.
当我们通过alloc或allocWithZone方法创建对象时,cocoa会返回一个未”初使化“过的对象。在这个过程中,cocoa除了上面提到的申请了一块足够大的内存外,还做了以下3件事:
- 将该新对象的引用计数(Retain Count)设置成1。
- 将该新对象的isa成员变量指向它的类对象。
- 将该新对象的所有其它成员变量的值设置成零。(根据成员变量类型,零有可能是指nil或Nil或0.0)
我再贴一段 NSObject.m 里关于 alloc和allocWithZone的实现
+ (id) alloc {return [self allocWithZone: NSDefaultMallocZone()]; } + (id) allocWithZone: (NSZone*)z {return NSAllocateObject (self, 0, z); }/*通过allocWithZone :类方法调用NSAllocateObject 函数分配了对象*/struct obj_layout {NSUInteger retained; }; inline id NSAllocateObject (Class aClass, NSUInteger extraBytes, NSZone *zone) {int size = 计算容纳对象所需内存大小;id new = NSZoneMalloc(zone,size);memset(new, 0, size);new = (id)&((struct obj_layout *)new)[1]; } /*NSAllocateObject 函数通过调用NSZoneMalloc 函数来分配存放对象所需的内存空间,之后将该内存空间置0,最后返回作为对象而使用的指针。*/
http://book.2cto.com/201305/23851.html 这里是我在网上寻的文章,详细解释了,它在内部是如何执行那三件事的.
关于 new , new 等同于 alloc init 双段构造,唯一缺点就是不能使用带参的构造, 如果new之后调用 initWithName 会出错,所以还是遵循官方约定的,使用双段构造.先写到这.
转载于:https://www.cnblogs.com/igqtdh/p/3257590.html
从零开始:iOS(三)相关推荐
- python从2 1 2 2 2 63_Python从零开始第三章数据处理与分析python中的dplyr(2)
目录 第二章(pandas) Python从零开始第三章数据处理与分析python中的dplyr(2) =============================================== ...
- [air for ios] 三小时开发一个iOS飞行射击游戏
[air for ios] 三小时开发一个iOS飞行射击游戏 http://www.badyoo.com/index.php/2012/07/04/158/index.html 2012-07-04 ...
- cocos creator2.3.5休闲游戏英文版(连连看)源码H5+安卓+IOS三端源码
cocos creator2.3.5休闲游戏英文版(连连看)源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整的源码可直接运营 ...
- cocos creator3.3.0休闲游戏(云浮消消乐)源码H5+安卓+IOS三端源码
cocos creator3.3.0休闲游戏(云浮消消乐)源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator3.X版本,完整的源码可直接运营. ...
- 休闲游戏合成植物打僵尸源码-H5+安卓+IOS三端源码
游戏引擎:Cocos Creator 2.3.3 编程语言:TypeScript cocos creator休闲游戏合成植物打僵尸源码-H5+安卓+IOS三端源码,开发脚本为javaScript方便扩 ...
- cocos creator休闲游戏甜品幻想H5+安卓+IOS三端源码开发脚本为javaScript
cocos creator休闲游戏甜品幻想H5+安卓+IOS三端源码,开发脚本为javaScript方便扩展和阅读,支持cocos creator2.X版本,完整的源码可拿来运营学习研究二次开发. 1 ...
- cocos creator经典游戏英文版《俄罗斯方块》源码H5+安卓+IOS三端源码
cocos creator2.2.2经典游戏英文版<俄罗斯方块>源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整 ...
- cocos creator2.2.2休闲游戏(单机捕鱼)源码H5+安卓+IOS三端源码
cocos creator2.2.2休闲游戏(单机捕鱼)源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整的源码可直接运营. ...
- 单枪匹马撸个聊天室, 支持Web/Android/iOS三端
单枪匹马撸个聊天室, 支持Web/Android/iOS三端 原文地址: github.com/yinxin630/b- 前排提醒, 阅读本文需要对JavaScript较为熟悉, 本文将讲解核心功能点 ...
- C++学习教程从零开始(三)——何谓变量
2019独角兽企业重金招聘Python工程师标准>>> C++学习教程从零开始(三)--何谓变量 本篇说明内容是C++中的关键,基本大部分人对于这些内容都是昏的,但这些内容又是编程的 ...
最新文章
- P1631 序列合并
- golang输入命令行参数
- 2020年高等数学方法与提高(上海理工大学)学习笔记:无穷级数
- Acwing第 18 场周赛【完结】
- 课后作业-结对编程项目总结
- dc综合与pt静态时序分析(中文)_小三电系统(PDU+DC+OBC)的技术研究
- C++word break断字(基于单词或字符串)(附完整源码)
- HarmonyOS之AI能力·二维码的生成和使用
- 阿里云容器服务发布 Knative 托管服务
- 超越存储,历久弥新!新华三发布入门级存储产品
- java工程师占比_25岁零基础转行学Java,他如今月入16k
- 机器学习入门二 ----- 机器学习术语表
- 【玖哥乱弹】程序员如何成为别人的男朋友
- 自检、开机故障及主板厂商资料
- matlab竞赛论文模板,数学建模竞赛论文模板.doc
- 爬虫--爬取雪球网数据
- Receptive Field Block Net for Accurate and Fast Object Detection(RFB)
- 热门!!Squid缓存加速——传统及透明模式服务搭建
- 第五期送书来了,这次送的都是畅销书!
- 微信公众平台接口测试账号网址
热门文章
- ES6(三)——Set、WeakSet、Map、WeakMap
- 一、AJAX学习笔记——原生AJAX (ajax简介、XML简介、ajax优缺点、ajax的使用)
- 五、scrapy爬虫框架——logging 模块的使用
- Web框架——Flask系列之Flask-SQLAlchemy安装与使用 定义数据模型(八)
- LeetCode 1899. 合并若干三元组以形成目标三元组
- LeetCode 834. 树中距离之和(树上DP)*
- LeetCode 365. 水壶问题(最大公约数)
- python gis 实例_用Python作GIS之五:从示例入手—example函数
- 标记语言Markdown介绍以及日常使用
- oracle 汇总上面所有,Oracle经验技巧汇总