整理一些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件事:

  1. 将该新对象的引用计数(Retain Count)设置成1。
  2. 将该新对象的isa成员变量指向它的类对象。
  3. 将该新对象的所有其它成员变量的值设置成零。(根据成员变量类型,零有可能是指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(三)相关推荐

  1. python从2 1 2 2 2 63_Python从零开始第三章数据处理与分析python中的dplyr(2)

    目录 第二章(pandas) Python从零开始第三章数据处理与分析python中的dplyr(2) =============================================== ...

  2. [air for ios] 三小时开发一个iOS飞行射击游戏

    [air for ios] 三小时开发一个iOS飞行射击游戏 http://www.badyoo.com/index.php/2012/07/04/158/index.html 2012-07-04 ...

  3. cocos creator2.3.5休闲游戏英文版(连连看)源码H5+安卓+IOS三端源码

    cocos creator2.3.5休闲游戏英文版(连连看)源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整的源码可直接运营 ...

  4. cocos creator3.3.0休闲游戏(云浮消消乐)源码H5+安卓+IOS三端源码

    cocos creator3.3.0休闲游戏(云浮消消乐)源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator3.X版本,完整的源码可直接运营. ...

  5. 休闲游戏合成植物打僵尸源码-H5+安卓+IOS三端源码

    游戏引擎:Cocos Creator 2.3.3 编程语言:TypeScript cocos creator休闲游戏合成植物打僵尸源码-H5+安卓+IOS三端源码,开发脚本为javaScript方便扩 ...

  6. cocos creator休闲游戏甜品幻想H5+安卓+IOS三端源码开发脚本为javaScript

    cocos creator休闲游戏甜品幻想H5+安卓+IOS三端源码,开发脚本为javaScript方便扩展和阅读,支持cocos creator2.X版本,完整的源码可拿来运营学习研究二次开发. 1 ...

  7. cocos creator经典游戏英文版《俄罗斯方块》源码H5+安卓+IOS三端源码

    cocos creator2.2.2经典游戏英文版<俄罗斯方块>源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整 ...

  8. cocos creator2.2.2休闲游戏(单机捕鱼)源码H5+安卓+IOS三端源码

    cocos creator2.2.2休闲游戏(单机捕鱼)源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整的源码可直接运营. ...

  9. 单枪匹马撸个聊天室, 支持Web/Android/iOS三端

    单枪匹马撸个聊天室, 支持Web/Android/iOS三端 原文地址: github.com/yinxin630/b- 前排提醒, 阅读本文需要对JavaScript较为熟悉, 本文将讲解核心功能点 ...

  10. C++学习教程从零开始(三)——何谓变量

    2019独角兽企业重金招聘Python工程师标准>>> C++学习教程从零开始(三)--何谓变量 本篇说明内容是C++中的关键,基本大部分人对于这些内容都是昏的,但这些内容又是编程的 ...

最新文章

  1. P1631 序列合并
  2. golang输入命令行参数
  3. 2020年高等数学方法与提高(上海理工大学)学习笔记:无穷级数
  4. Acwing第 18 场周赛【完结】
  5. 课后作业-结对编程项目总结
  6. dc综合与pt静态时序分析(中文)_小三电系统(PDU+DC+OBC)的技术研究
  7. C++word break断字(基于单词或字符串)(附完整源码)
  8. HarmonyOS之AI能力·二维码的生成和使用
  9. 阿里云容器服务发布 Knative 托管服务
  10. 超越存储,历久弥新!新华三发布入门级存储产品
  11. java工程师占比_25岁零基础转行学Java,他如今月入16k
  12. 机器学习入门二 ----- 机器学习术语表
  13. 【玖哥乱弹】程序员如何成为别人的男朋友
  14. 自检、开机故障及主板厂商资料
  15. matlab竞赛论文模板,数学建模竞赛论文模板.doc
  16. 爬虫--爬取雪球网数据
  17. Receptive Field Block Net for Accurate and Fast Object Detection(RFB)
  18. 热门!!Squid缓存加速——传统及透明模式服务搭建
  19. 第五期送书来了,这次送的都是畅销书!
  20. 微信公众平台接口测试账号网址

热门文章

  1. ES6(三)——Set、WeakSet、Map、WeakMap
  2. 一、AJAX学习笔记——原生AJAX (ajax简介、XML简介、ajax优缺点、ajax的使用)
  3. 五、scrapy爬虫框架——logging 模块的使用
  4. Web框架——Flask系列之Flask-SQLAlchemy安装与使用 定义数据模型(八)
  5. LeetCode 1899. 合并若干三元组以形成目标三元组
  6. LeetCode 834. 树中距离之和(树上DP)*
  7. LeetCode 365. 水壶问题(最大公约数)
  8. python gis 实例_用Python作GIS之五:从示例入手—example函数
  9. 标记语言Markdown介绍以及日常使用
  10. oracle 汇总上面所有,Oracle经验技巧汇总