`
iaiai
  • 浏览: 2196540 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

读《Objective-C培训资料》的摘要

 
阅读更多
#define nil NULL
bool型与c/c++是一样的,非0为 TRUE/YES, 0 为 FALSE/NO, 用 if(flag==YES) 就要注意了,此时 YES 就是 1,不过你直接用 if(flag) ..... 来判断就只要不是 0 就成立。

#import 和 c/C++ 的 include 一样也有 <> 和 "" 两种查找方式。但是它不怕重复引入。

NSLog() 会自动在输出后加 \n,相当于 System.out.println().

Objective-C 的对象需要直接或间接的继承自 NSObject。Objective-C 的 @interface 相当 java 的 class,而 @protocol 才是 Java 的 interface。类声明的基本方式如下:

@interface <#class#> : <#superclass#>
{
   <#ivars#>
}

<#methods#>

@end

@implementation <#class#>

<#methods#>

@end

(-) 表示实例方法
(+) 是类方法,即静态方法

函数的形式是:- (void) setNum: (int) n;
多个参数用 - (void) setNum: (int) n: (int)m;  用 [car setNum(1:3)]; 调用
或者给第一个之后的参数指定参数名,如
- (void) setNum: (int)n andHeight: (int)h andWidth: (int)w;  用 [car setNum: 1 andHeight: 5 andWidth: 10];
Objective-C 的方法参数有点怪异,第一个参数是没有参数名的,如果硬要说有,那就是方法名,统一说来,见到冒号,冒号前面那个就是参数名

没有指定返回类型就是 id 类型,输入参数默认也是 id 类型。

实例化:

Car* car = [[Car alloc] init]; 或 Car* car = [Car new]; 通常用前一种。

释放对象 [car release]; iPhone 平台不支持垃圾回收机制。

#define 和 C 的一样

数据声明及初始化 intPtr = (int[100){[0]=1, [50]=50, [51]=200};

int number;
scanf("%i", &number);
NSLog(@"Number is: %i", number);

输入

@protected @private $public @package 修饰变量,voaltile 和  const

所有方法都是 public 的,私有方法该如何声明呢?

NSString 和 NSMutableString 一个是不可变,一个是可变的, 相应的有 NSArray 和 NSMutableArray.

NSLog(@"String HERE %@", @"Hello world.");

[object retain] [object release]  分别使引用计数加 1 和减 1。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
RetainTracker *tracker;
tracker = [RetainTracker new]; // count: 1
[tracker retain]; // count: 2
[tracker autorelease]; // count: still 2
[tracker release]; // count: 1
NSLog (@"releasing pool");
[pool release];
// gets nuked, sends release to tracker

当使用alloc、new 或者通过copy 消息(生成接受对象的一个副本)创建一个对象,对象的引用计数器被设置成1。发送retain 消息将增加引用计数器,release 消息减1。

不必费心地释放其他方法返回的对象,这不是你的责任

通常的写法:
- (id)init
{
    if (self = [super init]){
        . . .
    }
    return (self) ;
}
注:在自己的初始化方法中,需要调用自己的指定的初始化函数或者超类的指定的初始化函数。一定要将超类的初始化函数的值赋给self 对象,并返回你自己的初始化方法的值。超类可能决定返回一个完全不同的对象。

存取器(属性)的例子:

//Car.h 文件
#import <Cocoa/Cocoa.h>

@interface Car : NSObject {
    NSString *name ;
}
@property (copy)NSString *name ;//表明类的对象具有 NSString* 类型的 name 属性,表明可以调用 - setName 和 - name 方法,即相应的 setter/getter 方法

@end //Car

//Car.m 文件
#import "Car.h"
@implementation Car
@synthesize name ; //表示实际创建该属性的访问器,即 - setName 和 -name 方法

@end //Car

//*********************************************************************************
最后就可以在main()函数中使用点表示法给对象赋值
Car *car = [[Car alloc] init] ;
car.name = @"Herbie" ;  //调用了 setName 方法
NSLog("%@", car.name);  //调用了 name 方法

@property 和 @synthesize 可同时指定多个。
@property (copy) int width, height;
@synthesize width, heigth;

该技术同样适用于int、char、BOOL、struct 甚至可以定义一个NSRect 类的对象的特性

@property (readwrite,copy)NSString *name;//对象可读写,对象将被复制
@property (readwrite,retain)NSString *name;//对象可读写,对象将被保持
@property (readonly)NSString *name;////对象只读

C/C++中支持的内存方式Objective-C 都支持(例如new,delete 或malloc,free), Objective-C 也有自己对象分配内存的方法:alloc,allocWithZone。

Objective-C 不支持多继承, 可以通过Objective-C 的分类和协议特性获取多继承的优点

@class XYPoint; //代替#import "XYPoint.h"
//使用@class 指令提高效率,编译器不需要处理整个XYPoint.h 文件,只需要知道XYPoint 是一个类名, 但是如果需要引用XYPoint 类中方//法, @class 指令是不够的,必须用#import "XYPoint.h"。

分类的应用:

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
    int c;
}

-(id) init;
-(void) toString;
@end
@implementation Car

-(id) init
{
    if(self=[super init])
    {
        c = 100;
    }
    return self;
}
-(void) toString
{
    NSLog(@"YES id: %i", c); //分类后最原始的方法访问不到了
}

@end

//进行分类,类名与已有类名相同
@interface Car(Unmi) //括号中任意指定一个 Category 名

-(void) toString;

@end

@implementation Car(Unmi)

-(void) toString //分类方法的实现
{
    NSLog(@"Category id: %i", c); //分类中的方法可以引用变量
}

@end

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

Car* car = [[Car alloc] init];
[car toString]; //这行的输出是 Category id: 100

[pool drain];

return 0;
}

关于分类的一些注意事项
A、尽管分类可以访问原始类的实例变量,但是它不能添加自身的任何变量。如果需要添加变量,可以考虑创建子类。
B、分类可以重载该类中的另一个方法,但是通常认为这种做法不可取。因为,重载之后,再不能访问原来的方法。
C、可以拥有很多分类。
D、和一般接口部分不同的是,不必实现分类中的所有方法。这对于程序扩展很有用,可以在该分类中声明所有方法,然后在一段时间之后才实现它。
E、通过使用分类添加新方法来扩展类不仅会影响这个类,同时也会影响它的所有子类。

@synthesize name=_name; 的用法:

@interface Car : NSObject
@property (copy) NSString* name;
@end
@implementation Car
@synthesize name=_name; //这个的效果会同时声明一个 _name 实例变量,方便于内部操作
@end

上面相当于,声明了一个实例变量

@interface Car : NSObject
{
    NSString* _name;
}
@property (copy) NSString* name;
@end
@implementation Car
@synthesize name;
@end

这样在实例方法中就可以直接引用 _name, 如
-(void) foo
{
    _name = @"abc";
}

协议间也是可以相互继承的,并且不能定义成员变量,只能定义方法。protocol 的声明方式:

@protocol MyProtocol
- (void)myProtocolMethod;
@end

应用协议的代码:
@interface Cat : NSObject <myProtocol>;
可以应用多个协议
@interface Cat : NSObject <myProtocol, myProtocol2>

应用了协议必须实现协议中定义的方法,虽然未实现协议中的方法编译能通过,但运行时会报错的:

2011-05-24 15:05:35.065 test[5781:a0f] -[Cat myProtocolMethod]: unrecognized selector sent to instance 0x10010c6b0
2011-05-24 15:05:35.083 test[5781:a0f] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Cat myProtocolMethod]: unrecognized selector sent to instance 0x10010c6b0'

有关协议的注意事项:
A、如果一个类遵守某项协议,那么它的子类也遵守该协议。
B、通过在类型名称之后的尖括号中添加协议名称,可以借助编译器的帮助来检查变量的一致性,如下:
id <Drawing> currentObject; //协议是不有点像泛型那么回事啊
这告知编译器currentObject 将包含遵守Drawing 协议的对象。如果向currentObject 指派静态类型的对象,这个对象不遵守Drawing 协议,编译器将给出warning。
再次提到id 类型,如果向currentObject 指派一个id 变量,不会产生这条消息,因为编译器不知道存储在id 变量中的对象是否遵守Drawing 协议。
C、如果这个变量保存的对象遵守多项协议,则可以列出多项协议,如下:
id <Drawing, Drawing 1> currentObject;
D、定义一项协议时,可以扩展现有协议的定义。以下协议
@protocol Drawing3D <Drawing>
说明 Drawing3D 协议也采用了Drawing 协议。因此采用Drawing3D 协议的类都必须实现此协议列出的方法,以及Drawing 协议的方法。
E、分类也可以采用一项协议,如:
@interface Fraction (stuff) <NSCopying, NSCoding>
此处,Fraction 拥有一个分类stuff,这个分类采用了NSCopying 和NSCoding 协议。

在构建数组 NSArray,用 arrayWithObjects 时最后一个元素需要是 nil,即:
NSArray* array = [NSArray arrayWithObjects: @"ab", @"cd", nil];

用对象的 copy、mutableCopy 可复制出对象。

Archive(归档),序列化与反序列化:对象是NSString、NSDictionary、NSArray、NSData、NSNumber 对象时,可以使用writeToFile:atomically:方法将数据写到文件中,是以属性列表的形式写到文件中的。参数atomically 为YES,表示先将数据写到临时备份文件中,一旦成功,再转移到文件中。

相应的,像 dictionaryWithContentOfFile 函当我可以从文件中读取序列化出对象来,

写出的文件内容格式, NSArray 的样子是:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version=”1.0”>
    <array>
        <string>I<string>
        <string>seem<string>
        <string>to<string>
        <string>be<string>
        <string>a<string>
        <string>verb<string>
    </array>
</plist>

NSDictionary  writeToFile 的文件是:

<key>...</key>
<string>...</string>

读回数据还可以用的方法dataWithContentOfFile/stringWithContentOfFile/dictionaryWithContentOfFile/arrayWithContentOfFile

还有 NSKeyedArchivers 的 archiveRootObject:toFile 和 unArchiveObjectWithFile
分享到:
评论

相关推荐

    计算机基础知识及应用技术总结

    内容概要:文档涵盖计算机基础知识,包括计算机历史(首台电子计算机ENIAC)、设计架构原则(冯·洛伊曼提出的五大组件)及其发展四阶段。介绍了计算机的基础概念如二进制、ASCII、国际码及存储单位等;涉及多媒体文件格式分类,计算机网络架构(硬件构成和类型),操作系统(包括服务器和个人计算类型)。解释了进程和线程概念及区别、计算机系统组成及基本组成部分,指令执行机制以及计算机网络的主要优点。最后提及了一些与安全性和数据保护有关的概念比如防火墙。 适合人群:计算机科学初学者或希望通过一级考试的人。 使用场景及目标:①帮助准备全国计算机等级考试一级的考生复习关键知识点;②提供信息技术基础教学资料给相关课程教师。 阅读建议:此文档主要侧重于计算机基础知识的学习,涵盖了从早期计算技术到现代网络技术等多个方面的重要信息。建议结合具体例题理解和记忆文中提到的各种术语和技术细节,在复习时可以通过制作思维导图的方式来加深印象。

    基于51单片机RFID智能门禁系统红外人流量计数统计.zip

    基于51单片机RFID智能门禁系统红外人流量计数统计 本系统由STC89C52单片机核心板、RFID读卡器模块、继电器、LCD1602液晶显示、蜂鸣器报警、红外避障传感器及电源组成。 1、匹配过的RFID模块检测到刷卡后,继电器闭合。液晶上显示通过字样。3s左右后,继电器自动断开。表示刷卡成功,闸门打开,人员通过。 2、没匹配过的RFID卡刷卡后,继电器不闭合,如果刷入没有写入系统卡蜂鸣器报警,且液晶上的显示不通过字符。 3、通过红外避障传感器计数,如果感应到有人,液晶上计数加1。 资料包含: 程序源码 电路图 任务书 答辩技巧 开题报告 参考论文 系统框图 程序流程图 使用到的芯片资料 器件清单 焊接说明 疑难问题说明 等等

    时间序列-白银-周线数据

    时间序列 白银 间隔1周

    最新云码付多合一全自动码商 商户 代理 支付一体系统完整数据源码

    云码付多合一全自动码商是一种集成了多种支付方式的支付系统,旨在为商户提供便捷的支付解决方案。该系统支持微信、支付宝、云闪付等多种主流支付方式,并且能够实现多码合一,即通过一个二维码完成所有支付操作。此外,该系统还具备全自动化的功能,可以自动处理支付、结算和数据统计等事务,极大地简化了商户的运营流程。 这种多合一的支付系统不仅提高了支付效率,还减少了商户管理多个收款码的复杂性,使得资金统一进入商户的独立管理后台,便于对账和管理。同时,该系统还支持商户代理模式,允许代理商通过该系统拓展更多的商户网络。 总之,“云码付多合一全自动码商”是一款功能强大且智能化的支付系统,适用于需要高效、便捷支付解决方案的各类商户。

    Moonshot编程语言用户手册基础教程

    欢迎来到Moonshot编程语言的世界!本教程旨在为初学者提供一个全面的入门指南,帮助您快速掌握Moonshot编程语言的基本概念和使用方法。无论您是编程新手还是希望学习新语言的资深开发者,本教程都将为您提供必要的知识和技能。

    开发API接口协议。非微信ipad协议、非mac协议非安卓协议,api可实现微信99功L.zip

    1微信开发sdk,微信二次开发SDK,微信开发API接口协议。非微信ipad协议、非mac协议非安卓协议,api可实现微信99功L

    matlab7-matlab教程.ppt

    matlab7--matlab教程.ppt

    【语音去噪】基于matlab人声滤除滤波器【含Matlab源码 9172期】.mp4

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    (源码)基于JSP和Servlet的超市供应商订单管理系统.zip

    # 基于JSP和Servlet的超市供应商订单管理系统 ## 项目简介 本项目是一个基于JSP和Servlet的超市供应商订单管理系统(SMBMS)。系统主要用于管理超市的供应商、订单和用户信息,提供了用户登录、密码修改、订单管理、供应商管理和用户管理等功能。通过该系统,用户可以方便地进行订单的增删改查、供应商的增删改查以及用户的增删改查操作。 ## 项目的主要特性和功能 1. 用户管理 用户登录和密码修改。 用户信息的增删改查。 用户角色管理。 2. 订单管理 订单的增删改查。 根据供应商ID查询订单数量。 订单分页查询。 3. 供应商管理 供应商的增删改查。 根据供应商名称和编码查询供应商列表。 供应商信息的分页查询。 4. 角色管理 获取角色列表。 5. 分页功能 支持用户、订单和供应商的分页查询。

    【重磅,更新!】全国31省份各省级城市和农村基尼系数测算面板数据(1989-2022年)

    1、资源内容地址:https://blog.csdn.net/abc6838/article/details/143818308 2、数据特点:今年全新,手工精心整理,放心引用,数据来自权威,且标注《数据来源》,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题 3、适用对象:大学生,本科生,研究生小白可用,容易上手!!! 4、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理

    yolo算法-情绪数据集-4879张图像带标签-愤怒-害怕-惊喜-悲哀的-幸福的.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    36-1 绘制6种典型曲线.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    华为云客服AI助手的大模型实践与思考.pdf

    华为云客服AI助手的大模型实践与思考.pdf

    1503ANDH1503002016_20241116222825

    1503ANDH1503002016_20241116222825

    C# WPF MVVM模式示例程序

    c# WPF界面程序,MVVM模式,使用VisualStudio 2022/2019均可打开

    MindSpeed-LLM作为昇腾大模型训练框架,旨在为华为 昇腾芯片 提供端到端的大语言模型训练方案,

    MindSpeed-LLM作为昇腾大模型训练框架,旨在为华为 昇腾芯片 提供端到端的大语言模型训练方案, 包含分布式预训练、分布式指令微调、分布式偏好对齐以及对应的开发工具链。

    快递分发系统用户手册.doc

    快递分发系统用户手册

    TAS5342A数字功放数据手册

    TAS5342A是一个低成本的四进四出的数字功放芯片,每个通道能达到100W。可以纯硬件设计。

    一个使用Java完成的仿超级玛丽小游戏.zip

    本资源是一个使用Java语言编写的仿超级玛丽小游戏项目,适合Java初学者学习编程和游戏开发。项目包含完整的源代码,涵盖了游戏逻辑、图形渲染、用户输入处理等核心功能。通过本项目,学习者可以深入理解Java编程的基本概念,如类与对象、继承、接口、多态等面向对象特性,同时掌握图形用户界面(GUI)编程基础和事件处理机制。项目还展示了简单的游戏循环和动画效果实现方法,帮助学习者逐步构建起对Java编程和游戏开发的全面理解。此外,本项目也提供了丰富的扩展空间,学习者可以根据兴趣进一步完善游戏内容。请注意,本资源仅供学习和研究使用。

    Kettle 是Kettle E.T.T.L. Envirnonment只取首字母的缩写,这意味着它被设计用来帮助你实现你的

    什么是 Pentaho Pentaho Data Integration (PDI) 提供抽取、转换和加载 (ETL) 功能,使用统一的方式实现了一系列复杂的ETL过程。 如果你第一次接触 Pentaho,你可能会看到或听到 Pentaho 数据集成称为“Kettle”。Pentaho Data Integration 最初是一个名为“Kettle”的开源项目。术语 KETTLE 是一个递归术语,代表 Kettle Extraction Transformation Transport Load Environment。Pentaho 收购 Kettle 后,更名为 Pentaho Data Integration。其他 PDI 组件(例如Spoon、Pan和Kitchen)的名称最初是为了支持 ETL 产品的“烹饪”隐喻。 PDI 常见用途 PDI 客户端(也称为 Spoon)是一个桌面应用程序,使你能够构建转换以及安排和运行作业。 PDI 客户端的常见用途包括: 不同数据库和应用之间的数据迁移。 充分利用云、集群和大规模并行处理环境将大量数据集加载到数据库中。 数据清洗,步

Global site tag (gtag.js) - Google Analytics