http://www.hengxinsoft.com/2010/12/objective-c-%E5%85%A5%E9%97%A8%EF%BC%88%E7%BB%99%E6%96%B0%E4%BA%BA%E7%9A%84%EF%BC%89/

 

基本知识

nil     类似于C中的NULL, 但nil是Object, 可以发送消息给nil
如:
[nil message]

BOOL 也是通过类库实现的, 分别是YES和NO

#import   类似了  #include ,但不会存在重复包含的问题

在普通的双引号字符串前放置一个@符号,就成了一个 NSString对象

方法名字前面的单个减号(-)表明该方法是一个实例方法。如果方法名字前面是一个加号(+),则表明该方法是一个类(static)方法。
这个概念在C++中也是有的.

跟其他大多数面向对象的语言一样, Objective-C的类 提供了 将数据与操作这些数据的动作进行封装的 基本构造.   对象是类的运行时实例,包含了它自己的 实例变量和方法指针的内存拷贝.

Objective-C的类,包含两个不同的部分:接口和实现.   接口部分  含有类的声明,定义了实例变量,已经同这个类相关的一些方法.   接口通常放在.h文件中.     实现部分 还有 类的方法的实际的代码.  实现通常放在    .m 文件中

下面的图,显示了 声明一个叫做 MyClass的类的语法.  MyClass从NSObject基类中继承.  类的声明总是以 @interface 这个编译器指令 开始,并以 @end 指令结束.   在类名之后(中间用冒号分开) 是 父类的名字.    类的 实例(或者成员)变量 也被声明在一个代码块中(用花括号括起来).   在实例变量块 之后, 是方法的列表.  每个方法或者每个实例变量的声明之后要用分号结束.

当用变量保存对象的时候,始终应该使用指针类型。Objective-C对包含对象的变量支持强弱两种类型。强类型指针的变量类型声明包含了类名。 弱类型指针使用id作为对象的类型。弱类型指针常用于类的集合(collection class),在集合中对象精确的类型可以是未知的。如果你用过强类型语言,你也许觉得使用弱类型变量可 能会带来问题,但是他们实际上给了Objective-C程序巨大的灵活性,而且使它又更强的动态性。

下面的例子里,展示了MyClass类的强类型和弱类型声明变量:

MyClass* myObject1; // Strong typing
id myObject2; // Weak typing

注意第1个声明里的*.   在Objective-C中,  对象的引用就是指针.  如果你不能完全理解,不要担心—你不必是指针方面的专家,就可以开始Objective-C的编程. 你只需要记住: 要将*放在 强类型 对象声明的 变量名前.

Learning Objective-C: A Primer
Objective-C入门手册

方法和消息

Objective-C中的类可以分为两种类型的方法:  实例方法(instance methods)和类方法(class methods).   实例方法就是一个在类的一个具体实例的范围内执行的方法。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。而类方法,不需要你创建一个实例。

方法声明包括方法类型标识符(type identifier),返回值类型,一个或多个方法标识关键字(sinature keywords),参数类型和名信息。下图展示insertObject:atIndex:实例方法的 声明。

声明由一个减号(-)开始,这表明这是一个实例方法。方法实际的名字(insertObject:atIndex:)是所有方法标识关键字的联合,包括冒号。冒号表明了参数的出现。如果方法没有参数,你可以省略第一个(也是唯一的)方法标识关键字后面的冒号。本例中,这个方法有两个参数。

当你想调用一个方法,你可传递消息给对象。这里消息就是方法标识符(method signature),以及传递给方法的参数信息。发送给对象的所有消息都会动态分发,这样有利于 实现Objective-C类的多态行为。也就是说,如果子类定义了跟父类的具有相同标识符的方法,那么子类首先收到消息,然后可以有选择的把消息转发 (也可以不转发)给他的父类。

消息被方括号( [ 和 ] )包括。方括号中间,接收消息的对象在左边,消息(包括消息需要的任何参数)在右边。例如,给myArray变量传递消息insertObject:atIndex:消息,你需要使用如下的语法:

[myArray insertObject:anObj atIndex:0];

为了避免声明过多的保存临时结果的本地变量,Objective-C允许你使用嵌套消息。每个嵌套消息的返回值可以作为其他消息的参数或者目标。例如,你可 以用任何获取这种值的消息来代替前面例子里面的任何变量。所以,如果你有另外一个对象叫做myAppObject拥有可以访问数组对象,以及插入对 象到一个数组的方法,你可以把前面的例子写成如下的样子:

[[myAppObject getArray] insertObject:[myAppObject getObjectToInsert] atIndex:0];

虽然前面的例子都是传递消息给某个类的实例,但是你也可以传递消息给类本身。当给类发消息,你指定的方法必须被定义为类方法,而不是实例方法。你可以认为类方法跟C++类里面的静态成员有点像(但是不是完全相同的)。

类方法的典型用途是用做创建新的类实例的工厂方法(factory method),或者是访问类相关的共享信息的途径。类方法声明的语法跟实例方法的几乎完全一样,只有一点小差别。与实例方法使用减号作为方法类型标识符不同,类方法使用加号( + )。

下面的例子演示了一个类方法如何作为类的工厂方法。在这里,arrayWithCapacity是NSMutableArray类的类方法,为类的新实例分配内容并初始化,然后返回给你。

NSMutableArray* myArray = nil; // nil is essentially the same as NULL

// Create a new array and assign it to the myArray variable.
myArray = [NSMutableArray arrayWithCapacity:0];

下面的代码展现了前面例子中MyClass类的实现。类似于类声明那样,类实现的位置也由两个编译器命令确定,@implementation和@end。这些命令给编译器提供了将方法和对应类联系起来所需的范围信息。因此方法的定义和接口中对应的声明是匹配的,只是多了个代码块而已。

@implementation MyClass

- (id)initWithString:(NSString *) aName
{
if (self = [super init]) {
name = [aName copy];
}
return self;
}

+ (MyClass *)createMyClassWithString: (NSString *) aName
{
return [[[self alloc] initWithString:aName] autorelease];
}
@end

声明属性

属性是用来代替声明存取方法的便捷方式。属性不会在你的类声明中创建一个新的实例变量。他们仅仅是定义方法访问已有的实例变量的速记方式而已。暴露实例变量的类,可以使用属性记号代替getter和setter语法。类还可以使用属性暴露一些“虚拟”的实例变量,他们是部分数据动态计算的结果,而不是确实保存在实例变量内的。

实际上可以说,属性节约了你必须要些的大量多余的代码。因为大多数存取方法都是用类似的方式实现的,属性避免了为类暴露的每个实例变量提供不同的getter和setter的需求。取而代之的是,你用属性声明指定你希望的行为,然后在编译期间合成基于声明的实际的getter和setter方法。

属性声明应该放在类接口的方法声明那里。基本的定义使用@property编译选项,紧跟着类型信息和属性的名字。你还可以用定制选项对属性进行配置,这决定了存取方法的行为。下面的例子展示了一些简单的属性声明:

@property BOOL flag;
@property (copy) NSString* nameObject; // Copy the object during assignment.
@property (readonly) UIView* rootView; // Create only a getter method.

使用属性另外的好处就是你可以在代码中访问他们的时候,使用点语法,如下面的例子所示:

myObject.flag = YES;
CGRect viewFrame = myObject.rootView.frame;

虽然前面例子里面的对象和属性名是故意这么取的,他们还是展现了属性的灵活性。点语法实际上隐藏了对应的方法调用。每个可读的属性由一个与属性同名的方法支持。每个可写属性由一个叫做“set属性名”的额外方法来支持,属性名的第一个字母要大写。(这些方法是属性的实际实现方式,也是你可以声明一个没有任何实例变量支持的属性声明的原因。)如果用方法来代替前面代码中的属性,你就要下下面的代码:

[myObject setFlag:YES];
CGRect viewFrame = [[myObject rootView] frame];

字符串

作为C语言的超集,Objective-C支持C语言字符串方面的约定。也就是说,单个字符被单引号包括,字符串被双引号包括。然而,大多数 Objective-C框架通常不使用C语言风格的字符串。反之,大多数框架把字符串传递给NSString对象。

NSString类提供了字符串的对象包装,包含了所有你期望的优点,包括对保存任意长度字符串的内建内存管理机制,支持Unicode,printf风格的格式化工具,等等。因为这种字符串使用的非常频繁,Objective-C提供了一个助记符可以方便地从常量值创建NSString对象。要使用这个助记符,你需要做的全部事情,是在普通的双引号字符串前放置一个@符号,如下面的例子所示:

NSString* myString = @”My String\n”;
NSString* anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"];

// 从一个C语言字符串创建Objective-C字符串
NSString* fromCString = [NSString stringWithCString:"A C string" encoding:NSASCIIStringEncoding];

协议和委托(Protocols and Delegates)

协议声明了可以被任何类实现的方法。协议不是那些类本身,他们仅是定义一个接口,其他的对象去负责实现。你在你的一个类里实现了协议里面的方法,就说你的类符合协议。

协议常用来指定委托对象的接口。委托对象就是一个扮演其他对象或者同其他的对象进行协作的 对象.。了解协议,委托和其他对象的互操作(interplay)最好的办法就是看一个例子。

UIApplication 类实现了一个程序需要的行为。为了接收关于程序当前状态的简单消息通知(notifications),并不需要强制你创建UIApplication的一个子类,反之 UIApplication类通过调用它指定的委托对象的特定方法来传递这些消息通知。实现UIApplicationDelegate协议的对象都可以接受这样的通知,并提供合适的响应。

协议的声明跟类接口的声明很像,只是协议没有父类,而且他们不会定义任何实例变量。下面的例子展示了一个有一个方法的协议声明:

@protocol MyProtocol
- (void)myProtocolMethod;
@end

在大多数委托协议情况下,使用某种协议仅仅是简单的实现协议定义的方法而已。 有些协议要求你明确的表明你支持这种协议,协议可以指定必须或者可选的方法。在你深入开发的过程中,你应该花点时间学习协议以及他们的用途

The Objective-C Programming Language

http://www.yayabo.cn/thread-463-1-1.html

@selector(method_name) 返回由 方法名method_name标示的编译后的选择器

@protocol(protocol_name)返回protocol_name协议(协议类的一个实例). 对协议进行前置声明时,也是用 @protocol 开头,但不需要写 protocol_name

@class 声明在其他地方定义的类 (一般在头文件里用)

@synchronized() 定义一个代码块,它必须一次只在一个线程里执行 (不能同时在多个线程里执行)

要实现一个委托协议,需要把协议的名称放在尖括号里,加入到头文件的@interface语句中,尖括号要在该类所继承的父类的名字的后面。 也就是说, 类所实现的任何协议都附加在最后的尖括号之中(<和>)
然后,在实现(.m)文件中,实现所有需要的方法和其他感兴趣的方法。
最后,把对象设置成委托,或者通过在IB中连接到一个委托插座变量,或者用代码设置一个属性(例如,textField.delegate = self; )

如果一个类要采纳某个协议,需要在在@interface导向符后、紧接着超类的位置上指定协议的名称,并包含在尖括号中。一个类可以采纳多个协议,不同的协议之间用逗号分隔。下面是Foundation框架中的NSData类采纳三个协议的方式:

@interface NSData : NSObject

通过采纳这些协议,NSData许诺自己要实现协议中声明的所有方法。范畴也可以采纳协议,对协议的采纳将成为类定义的一部分。

http://www.apple.com.cn/developer/Documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/chapter_3_section_3.html

在头文件中用@property声明属性,然后在实现中用@synthesize让编译器产生getter和setter。

Objective-C 入门(给新人的)的更多相关文章

  1. [转] 从 C 到 Objective C 入门1

    转自: http://blog.liuhongwei.cn/iphone/objective-c/ 进军iPhone开发,最大的难点之一就是怪异的Objective C语法了.不过,了解之后才发现,原 ...

  2. 给刚通过51入门的新人讲讲S12(MCS12XS128)与51的差别

    MCS51是keil也对应地做好了非常多,也就是有非常多对你而言是透明的,是你不必关心的,你所要接触的寄存器数量也非常小,在这个时候你很多其它是写函数,仅仅只是针对这个平台写C程序比在PC上写C控制台 ...

  3. 【原创】JDK动态代理,此次之后,永生难忘。

    动态代理,这个词在Java的世界里面经常被提起,尤其是对于部分(这里强调“部分”二字,因为有做了一两年就成大神的,实力强的令人发指,这类人无疑是非常懂动态代理这点小伎俩的)做了一两年新人来说,总是摸不 ...

  4. (转载)Linux下安装配置MySQL+Apache+PHP+WordPress的详细笔记

    Linux下安装配置MySQL+Apache+PHP+WordPress的详细笔记 Linux下配LMAP环境,花了我好几天的时间.之前没有配置过,网上的安装资料比较混乱,加上我用的版本问题,安装过程 ...

  5. jpg、jpeg、png... 的区别

    对于做设计这一行的人来说,这几个图片格式是最常用的,也是最常见的,几乎每一天都要与他们打交道. 刚刚入门的新人通常不知道在什么地方如何使用他们或者说如何更有效的使用他们. 那他们到底是有什么区别?(一 ...

  6. Vue下路由History mode导致页面无法渲染的原因

    用 Vue.js + vue-router 创建单页应用,是非常简单的.使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将组件( ...

  7. 【干货】快速部署微软开源GPU管理利器: OpenPAI

    [干货]快速部署微软开源GPU管理利器: OpenPAI 介绍 不管是机器学习的老手,还是入门的新人,都应该装备上尽可能强大的算力.除此之外,还要压榨出硬件的所有潜力来加快模型训练.OpenPAI作为 ...

  8. HyperLedger Fabric 学习思路分享

    HyperLedger Fabric 学习思路分享 HyperLedger Fabric最初是由Digital Asset和IBM公司贡献的.由Linux基金会主办的一个超级账本项目,它是一个目前非常 ...

  9. 安装部署 OpenPAI Install OpenPAI on Ubuntu

      介绍 不管是机器学习的老手,还是入门的新人,都应该装备上尽可能强大的算力.除此之外,还要压榨出硬件的所有潜力来加快模型训练.OpenPAI作为GPU管理的利器,不管是一块GPU,还是上千块GPU, ...

  10. [转]Cryengine渲染引擎剖析

    转篇Napoleon314 大牛的分析,排版好乱,见谅,耐心读,这是个好东西,注意看他自己的实现,是个技术狂人啊,Ogre焕发次时代的光芒啊~~~努力 ------------------------ ...

随机推荐

  1. request对象方法详解

    自己整理的 javax.servlet.http.HttpServletrequest 所有方法,欢迎收藏! 方法名 说明 isUserInRole 判断认证后的用户是否属于某一成员组 getAttr ...

  2. 在XMPP的JAVA开源实现Openfire中,增加LBS 附近的人功能

    1. XMPP协议 与 Openfire XMPP协议是IM领域的标准协议了,具体可参考  http://xmpp.org   及RFC6120,RFC6121,RFC6122等相关文档. http: ...

  3. careercup-栈与队列 3.1

    3.1 描述如何只用一个数组来实现三个栈. 解答 我们可以很容易地用一个数组来实现一个栈,压栈就往数组里插入值,栈顶指针加1: 出栈就直接将栈顶指针减1:取栈顶值就把栈顶指针指向的单元的值返回: 判断 ...

  4. IOS Remote Notification

    1. 本地证书合成 rm *.pem echo "export cert..." openssl pkcs12 -clcerts -nokeys -out push_cert.pe ...

  5. Java基础知识强化之集合框架笔记63:Map集合之HashMap嵌套ArrayList

    1. ArrayList集合嵌套HashMap集合并遍历. 需求:假设ArrayList集合的元素是HashMap.有3个.每一个HashMap集合的键和值都是字符串.元素我已经完成,请遍历. 结果: ...

  6. 利用AWS简单存储服务(S3)托管网站

    1.首先建立Storage Bucket存储桶,名为网站域名: 2.在[属性]中选择启用网站托管或重定向到另一主机,即可. 3.官方参考文档:https://docs.aws.amazon.com/z ...

  7. Linux下安装Python pip

    在Python环境下,pip提供类似yum一样的下载方式,比easy_install方便的多. 1.下载get-pip.py wget https://bootstrap.pypa.io/get-pi ...

  8. java.io.EOFException错误

    TOmcat启动后报:IOException while loading persisted sessions: Java.io.EOFException错误 - IOException while ...

  9. bootstrap3.0 模态框显示的文字超出怎么办

    版本:bootstrap3.3 模态框文字超出 解决方案: 在html中控制自动换行   其实只要在表格控制中添加一句<div style="word-break:break-all& ...

  10. java: Eclipse jsp tomcat 环境搭建(完整)

    ] 欢迎您! 要学习一门语言,首先要做的就是搭建环境,然后能写一个小的Demo(类似Helloworld),不仅可以建立信心,而且还可以为之后的学习搭建一个验证平台,事半功倍. net领域的vs,号称 ...