iOS中nil、Nil、NULL、NSNull详解

更新时间:2024-02-09 21:47:01 阅读量: 经典范文大全 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

篇一:objective-c self、nil、id用法专题总结

self、nil、id用法专题总结

id的用法,举个简单例子,很容易就理解和掌握了。

例:#import <Cocoa/Cocoa.h>

#import "Converter.h"

@interface Controller : NSObject {

IBOutlet id converter;

IBOutlet id dollarField;

IBOutlet id rateField;

IBOutlet id totalField;

}

-(IBAction)convert:(id)sender;

@end

另外再举一个例子。

@interface MyController:NSObject{

IBOutlet id textField;//插座变量通常使用id关键字动态地指定类型。您可将id关键字用作任何对象的类型,意味这个对象的类在运行环境中才确定。

// IBOutlet NSTextField *textField;// 当您不需要动态类型对象时,应该静态地指定插座变量为指向对象的指针。

}

@end

haoxue 2011-04-10 23:03

self用法详解,专题总结!

objective-c语言中的self,就相当于C++中的this指针。

学会使用self,首先要搞清楚属性这一概念。

以及理解getter和setter方法,它到底有什么用?

设置器与访问器,提供外界操作 类内部属性的 一个通道。假如,没有这个方法,外界怎么操作类的内部属性。假如不提供这两个方法,那么这个属性的值,就不能为外界所改变。

因为类的属性,一般是private 。属性一般是私有的。

haoxue 2011-04-10 23:12

nil用法

Objective-C中nil

nil

nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。

Nil

首字母大写的Nil和nil有一点不一样,Nil定义一个指向空的类(是Class,而不是对象)。

在Objective-C里,nil对象被设计来跟NULL空指针关联的。他们的区别就是nil是一个对象,而NULL只是一个值。而且我们对于nil调用方法,不会产生crash或者抛出异常。

这个技术被framework通过多种不同的方式使用。最主要的就是我们现在在调用方法之前根本无须去检查这个对象是否是nil。假如我们调了nil对象的一个有返回值的方法,那么我们会得到一个nil返回值。 我们可以通过nil对象让我们的dealloc函数实现看上去更帅一点:

- (void) dealloc

{

self.caption = nil;

self.photographer = nil;

[super dealloc];

}

之所以可以这么做是因为我们给把nil对象设给了一个成员变量,setter就会retain nil对象(当然了这个时候nil对象啥事情也不会做)然后release旧的对象。这个方式来释放对象其实更好,因为这样做的话,成员变量连指向随机数据的机会都没有,而通过别的方式,出现指向随机数据的情形机会不可避免。注意到我们调用的self.VAR这样的语法,这表示我们正在用setter,而且不会引起任何内存问题。

在Objective-C中,你来对象在功能上等价于其他很多语言中的NULL指针。区别是可以对nil调用方法,而不致导致程序崩溃或抛出异常。

lucyboy 2011-04-10 23:12

。。。。。。这个还需要总结么。。。。。。。

haoxue 2011-04-11 11:14

@property替你自动生成了set和get方法,虽然方便,但隐藏了很多细节。有必要讲解下。

头文件定义

NSButton *example.

- (NSButton *) example;

- (void) setExample:(NSButton *) newButton;

实现文件

- (NSButton *) example{

return example;

}

- (void) setExample:(NSButton *) newButton

{

if(example != newButton)

{

[example release];

example = [newButton retain];

}

}

这个就是编译器为我们自动生成的类似方法。

haoxue

如何判断NSMutableArray里面为nil或者什么的值?

nil 是数组结尾标志,不能作为数组元素,NSMutableArray 中元素为id类型。

建议买本Objective-c入门的书看看,好好补一下基础。

haoxue 2011-04-13 10:48 2011-04-11 12:00

command+双击,可以看里面具体的API接口!这样才能收获更多!

zzhangchenn 2011-04-13 11:28

Xcode4里面已经是单机而不是双击了。。。。

haoxue 2011-04-14 08:41

所有的Objective-C对象变量都是指针类型的。id类型被预定义为指针类型,因此不需要加星号了。

xuexixcode 2011-04-16 11:02

帖子很好啊,收藏了

haoxue 2011-04-20 00:03

注意:objective-c与C++比较

嵌套调用方法:

objective-c [[[对象方法1] 方法2] 方法3];

C++ 对象.方法1( ).方法2( ).方法3( );

方法调用形式:

objective-c [ 对象 方法名:参数A 方法名:参数B...];

C++ 对象.方法名(参数列表);

对象的创建:

objective-c 类名 对象指针=[[类名 alloc] 初始化方法];

C++ 类名对象指针=new 构造方法;

空指针:

objective-c nil

C++ NULL

篇二:release和nil

nil和release的作用与使用

对于一个指向对象的变量,它里面存储的是一个地址,一个指向内存中某块区域的地址。 nil:的作用就是将这个变量置为空,不指向任何地址。

release:的作用是将这个变量指向的内存中的对象的引用计数减一,直到引用计数为零时释放这块内存。

所以,如果你只是做了nil操作,那么就会引起内存泄露的问题,因为它永远也不会做release操作了。

如果你只是做了release操作,那么就有可能引起crash,原因就是只是release(我认为这个对象已经被释放)而没有将变量置为空,当你再对这个变量做操作时就会引起问题,因为你在对一个不存在的对象做操作。

所以建议,不再需要一个对象时,除了要做release操作以外还要做nil操作。

NSString *str; 此时str指向当前对象。所以对它的操作要小心,建议:NSString *str = nil; ==================================================== nil是将一个对象指针置为空,只是切断指针和内存中对象联系,还是占用内存的,并没有真正释放内存,只是将对象指针置为空。

release是真正通知内存释放对象,真正释放内存。

如果没有relase而是直接置为nil,那么程序编译运行时候可能不会出错,但是这存在内存泄露,因为置为nil后

release不起作用了。

如果只是release而没有置为nil,应用程序也不能不会报错,但是会不稳定,程序的健壮性不够好,因为没有设置self.obj = nil,在release这个obj后,如果在之后又用到了这个对象,因为在系统内存中已经不存在了,程序就会崩溃,所以在release一个对象后应该也要将该对象置为nil,在之后如果用到了这个obj也不会造成崩溃。

nil是给对象赋值,NSNULL是给指针赋值,例如判断一个对象 if(obj){

},NSNULL用于对集合操作。

篇三:Objective-C自学笔记

Objective-C自学笔记

什么是cocoa

Cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,是Mac OS X上五大API之一(其它四个是Carbon、POSIX、X11和Java)。对最终用户来说,使用Cocoa编程环境开发的应用程序即为Cocoa 应用。这类应用有独特的外观,因为Cocoa编程环境让程序在多方面自动遵循苹果公司的人机界面守则。Cocoa 应用程序一般在苹果公司的开发工具Xcode(前身为Project Builder)和Interface Builder上用Objective-C写成。

什么是框架

框架是一种把头文件、库、图片、声音等内容聚集在一个独立单元中的集合体。苹果公司将Cocoa、Carbon、QuickTime和OpenGL等技术作为框架集来提供。Cocoa的组成部分有Foundation和Application Kit(也称AppKit)框架。如果开发IOS程序,则会用到UIKit框架。

Foundation框架处理的是用户界面之下的那些层(Layer)的特性,比如数据结构和通信机制。由于Foundation框架不含UI对象,所以它的对象可以兼容,是两类UI框架的基础。Foundation框架是以另外一个框架CoreFoundation为基础创建的,CoreFoundation是纯C编写的,名称以CF开头。

苹果的面向对象开发框架,用来生成 Mac OS X 的应用程序。主要的开发语言为 Objective-c, 一个c 的超集。 Cocoa 开始于1989年9月上市的NeXTSTEP 1.0,当时没有Foundation框架,只有动态运行库,称为kit, 最重要的是AppKit. 1993 年 NeXTSTEP 3.1 被移植到了 Intel, Sparc, HP 的平台上,Foundation 首次被加入,同时Sun 和 NeXT 合作开发OpenStep,也可以运行在Windows 系统上。

每个框架都有一个主头文件,通过包含此主头文件,即可访问框架内的所有功能。例如包含foundation.h文件,即可获得Foundation所有功能。Import可保证头文件只被包含一次。如:#import <Foundation/Foundation.h>; 或#import <Cocoa/Cocoa.h>;尖括号<>表明导入系统头文件,双引号””表明导入项目本地的头文件。

避免名称冲突的NS前缀

使用前缀能避免名称冲突。Cocoa其所有函数、常量和类型名称都添加了NS(NextSTEP)前缀,这个前缀告诉我们函数来自Cocoa而不是其他工具包。

布尔类型BOOL,具有YES和NO两个值

Objective-C中的BOOL实际是一种对带符号的字符(signed char)的类型定义,通过define指令把YES定义为1,NO定义为0。例如:如果将一个大于一个字节的整型赋值给一个BOOL变量,那么将只有低位字节被用作BOOL值。如果该低位字节刚好为0,如0x2300,则此BOOL值将为NO值。注意:不要将BOOL值和YES直接比较,因为YES的值是整型的1。反之,直接与NO比较则一定是安全的,因为假值只有一个0。

常用数据类型(非类结构体):

? 范围结构体NSRange:typedef struct { usigned int location; unsigned int length; } NSRange;

? NSRange range; range.location = 17; range.length = 4;

? NSRange range = {17, 4};

? NSRange range = NSMakeRange(17, 4);

? 几何数据类型(处理集合图形的数据类型以CG前缀开头)

? 点:struct CGPoint {float x; float y;}; CGPointMake()函数。

? 大小:struct CGSize {float width; float height;}; CGSizeMake()函数。

? 矩形:struct CGRect {CGPoint point; CGSize size;}; CGRectMake()函数。

字符串@和NSString类

? @符号是Objective-c在标准C语言基础上添加的特性之一,意味着引号内的字符串应作为Cocoa的NSString字

符串元素来处理。例如:NSLog(@”Hello %@!”, string);如果是C类型的字符串,即不带@的字符串,输出时需使用“%s”格式。

? 创建字符串:NSString *string = [NSString stringWithFormat: @”%d”, 5];或:[*NSString alloc+ initWithString:@”car”]; ? 字符串大小:NSUInteger length = [string length];注意:可以处理各种语言的字符串长度

? 字符串比较:

? -(BOOL) isEqualToString: (NSString *) string; 比较两个字符串内容是否相同,返回BOOL值(YES或NO) ? - (NSComparisonResult) compare: (NSString *) string options: (NSStringCompareOptions) mask; 返回值:enum

{NSOrderedAscending=-1, NSOrderedSame, NSOrderedDescending }; mask选项:NSCaseInsensitiveSearch(不区分大小写);NSLiteralSearch(完全比较);NSNumericSearch(数值比较,100要排在99的后面)

? 注意:==运算符只判断两个字符串的指针是否相等,即是否是同一对象,并非是内容相同。

? 字符串查找:

? 查找前缀:- (BOOL) hasPrefix: (NSString *) string;

? 查找后缀:- (BOOL) hasSuffix: (NSString *) string;

? 查找位置:- (NSRange) rangeOfString: (NSString *) string; 没有找到则NSRange的location等于NSNotFound ? 可变字符串NSMutableString:

? NSString类是不可变immutable的,一旦被创建,则不能被修改。

? NSMutableString继承自NSString,可以使用NSString的所有特性和方法。

? 创建可变字符串:+ (id) stringWithCapacity: (NSUInteger) capacity; 此容量仅是建议,如42

? 附加新字符串:- (void) appendString: (NSString *) string; 或:- (void) appendFormat: (NSString *) format, …; ? 删除字符串:- (void) deleteCharactersInRange: (NSRange) range; 可以先使用rangeOfString查找位置再删除

集合类:

? NSArray:是一个Cocoa类,可放入任意类型的对象。但是有两个限制:一是只能存储Objective-C的对象,而

不能存储C的数据类型,如int/float/enum/struct;第二:不能存储nil值。

? 创建:NSArray *array = [NSArray arrayWithObjects: @”one”, @”two”, nil];逗号分隔的对象列表,nil结束 ? 字面量语法创建:NSArray *array = @[@”one”, @”two”];

? 数组个数:-(NSUInteger) count;

? 根据索引获得对象:-(id) objectAtIndex: (NSUInteger) index;

? 字面量语法获得数组项:id *object = array[1];

? 遍历数组:for(NSInteger i=0; i<[array count]; i++) NSLog(@“index %d has %@.”, i, array*i+);

? 字符串转化为数组:NSArray *array = [string componentsSeparatedByString: @”,”];切分逗号分隔的字符串 ? 数组转化为字符串:NSSting *string = [array componentsJoinedByString: @“,”];合并为逗号分隔的字符串 ? 可变数组NSMutableArray

? 创建:+ (id) arrayWithCapacity: (NSUInteger) numItems;注意:没有对应的字面量语法创建可变数组。 ? 在数组末尾添加对象:- (void) addObject: (id) anObject;

? 替代元素:replaceObjectAtIndex: index withObject: object

? 删除数组元素:- (void) removeObjectAtIndex: (NUSInteger) index;

? 枚举NSEnumerator:表示集合中迭代出的对象

? 创建:NSEnumerator *enum = [array objectEnumerator];

? 遍历:while(id one = [enum nextObject]) NSLog(@“%@”, one);

? 快速枚举:for(NSString *string in array) NSLog(@”%@”, string);

? 代码块:通过代码块可以让循环操作并发执行,而快速枚举是线性完成的。示例:

? [array enumerateObjectsUsingBlock:^(NSString *string, NSUInteger index, BOOL *stop) , NSLog(@”%@”,

string); }];

? 字典NSDictionary:存储键值对,键一般是NSString类型,值可以是任何对象。

? 创建:NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: obj, @”key”, nil+;

? 字面量方法创建:NSDictionary *dict = @,@”key1”: obj1, @”key2”: obj2-;

? 访问:Class *obj = *dict objectForKey: @“key”+;返回值:nil表明没有找到

? 字面量方法访问:Class *obj = dict[@”key”];

? 可变字典NSMutableDictionary:

? 创建:NSMutableDictionary *dict = [NSMutableDictionary dictionary];注意:没有对应的字面量语法创建。 ? 初始化:+ (id) dictionaryWithCapacity: (NSUInteger) numItems;

? 添加元素:- (void) setObject: (id)anObject forKey: (id)aKey;

? 删除元素:- (void) removeObjectForKey: (id)aKey;

? 其他数值类

? NSNumber类,用于封装基本数据类型。

? 字面量语法创建:NSNumber *number = @’X’/@12345/@12345ul/@12345ll/@123.45f/@123.45/@YES; ? 常用装箱(boxing)方法:

? + (NSNumber *) numberWithChar: (char) value;

? + (NSNumber *) numberWithInt: (int) value;

? + (NSNumber *) numberWithFloat: (float) value;

? + (NSNumber *) numberWithBool: (BOOL) value;

? 从NSNumber类中获取基本数据(开箱unboxing):charValue/intValue/floatValue/boolValue/stringValue ? NSValue类:NSNumber其实是NSValue的子类,NSValue可以封装任意值。

? 创建:+ (NSValue *) valueWithBytes: (const void *)value objCType: (const char *) type; 例如放入结构体:

NSValue *value = [NSValue valueWithBytes: &rect objCType:@encode(NSRect)];

? 访问(需要首先提供存储数值的变量地址作为参数,函数名以get开始):- (void) getValue: (void *) buffer; ? 常用方法:

? 装箱:+ (NSValue *) valueWithPoint: (NSPoint) aPoint; 开箱:- (NSPoint) pointValue;

? 装箱:+ (NSValue *) valueWithSize: (NSSize) size; 开箱:- (NSSize) sizeValue;

? 装箱:+ (NSValue *) valueWithRect: (NSRect);开箱:- (NSRect) rectValue;

? NSNull类:可以放入集合和字典中的代表空值的类,使用方法:[NSNull null];注意:(null)是一个真正的nil

值,而<null>是一种[NSNull null]对象

? 注意:请不要创建NSString、NSArray或NSDictionary的子类,它们是采用类簇(class clusters)的方式实现的。

所以应该采用复合的方法使用这些类。

面向对象编程OOP的常用术语

? 泛型id:是一种标识符,可以用来引用任何类型的对象,即指向一个对象体的指针,并不会实际复制对象

的全部内容。如:id shape = shapes[i];

? 类:是一种表示对象类型的结构体,对象通过它的类来获取自身的各种信息,包括数据和代码。命名类名

时采用首字母大写。

? 对象/实例:是一种包含值和指向其类的隐藏指针的结构体。命名时不需要首字母大写。

? 消息/调用方法:是对象可执行的操作。对象接收消息后,将查询其对应的类,找到正确的代码并执行。

用方括号来调用方法,如:[shape draw]; 方括号里的第一项是对象,其余部分是需要对象执行的操作。在本例中就是希望shape对象执行draw操作。根据对象的类,消息可以调用不同的方法。

? 类方法:如果函数声明前面不是减号而是一个加号+,则说明这是一个类方法,也称为工厂方法,属于类

对象,而不是类的实例对象,通常用于创建新的实例,也可以不创建类的实例直接使用。

? 接口:是类为对象提供的特性描述,即类可以实现的功能。

@interface Circle : NSObject { //如果使用Cocoa框架,则需要继承NSObject类

@private

int mParam; //类的实例变量;如果没有实例变量,则可以省略花括号

}

- (void) draw; //最前的- 表明这是Objective-C方法的声明

- (void) setBounds: (int) iBounds;

@end //Circle

? 实现:是使接口能正常工作的代码。

@implementation Circle

- (void) setBounds: (int) iBounds {

self->mParam = iBounds;

}

? 实例化对象instantiation:需要分配内存,并初始化变量为默认值。

idshapes[3];shapes[0] = [Circle new];

? 自定义NSLog:NSLog可以使用%@格式说明符来输出对象信息,需要类实现以下代码(注意description函

数不需要在接口中声明,是从NSObject重写的方法):

- (NSString *) description , return (@”object information”); -

? 继承inheritance:

? Objective-C只能继承一个父类,可以通过类别category或协议protocal来达到多继承的效果。

? 方法调度:首先搜索当前类中的方法,如果搜索不到,则在该对象的超类中查找。

? NSObject类声明了一个名为isa(isa是一个)的实例变量,保存了一个指向对象当前类的指针。

? 重写方法:子类继承并重写父类的方法,调度时执行重写后的方法。

? Super关键字:当需要调用超类中实现的功能,需要使用super作为方法调用的目标。在重写方法时,

调用超类的方法能够保证继承的方法获得所有特性。

? 复合composition:类似于多个组件的组合,在对象中可以再引用其他对象提供的特性,是通过包含作为实

例变量的对象指针来实现的。使用步骤:首先生成新的类实例并分配内存,将对象实例指针初始化为nil;然后根据复合的类生成新的复合类对象,并将复合对象指针赋值给类的实例指针。例如下面的初始化函数: @interface Car : NSObject{

}

@end // Car 函数同样不需要在接口声明,直接实现即可

超类初始化后,返回的就是被初始化的对象 } engine = [Engine new]; //生成新的实例对象,并赋值给实例对象指针 Engine *engine; //实例对象的指针,默认为nil return (self);

? 复合和继承的区别:继承的类之间建立的关系为”is a”(是一个)的关系;而复合的类之间建立的关系为”has

a”(有一个)的关系。

? 存取方法accessor:用来读取或改变某个对象属性的办法。命名方法:

? setter方法:set前缀加属性名,如:- (void) setTire: (Tire*) tire atIndex: (int) index;

? getter方法:以其返回的属性名命名,不加get前缀,如:- (Tire*) tireAtIndex: (int) index;

? get这个词在Cocoa中有特殊的含义,如果其出现在方法名称中,就意味着这个方法需要将传递的指

针作为参数并返回数值。

Tire *tire = [Tire new]; //这里是实际声明并初始化对象的地方

[car setTire: tire atIndex: 2]; //这里设置的只是指针的传递,并非复制了一个对象

NSLog(@”car’s tire at 2 is %@”, *car tireAtIndex:2]); //调用getter方法读取属性值的description函数

源文件组织

? 跨文件依赖关系:如果一个头文件有变化,那么所有依赖它的文件都要重新编译。

? 关键字@class:告诉编译器,这是一个类,程序只会通过指针来引用它。这样,编译器在编译的时候,只

需知道要引用的类名即可,不需要了解类的整个定义,即不需要导入该类的头文件,减少由于依赖关系引起的重新编译,尤其在循环依赖的文件中。但是对于继承的类,不能使用这个关键字,必须导入超类。

内存管理

? 对象生命周期:包括诞生(alloc或new产生)、生存(接收消息并执行操作)、交友(复合)和消亡(释放)。

? 引用计数(reference counting)或保留计数(retain counting):每个对象都有一个何其关联的整数,被称作

引用计数器。当使用alloc或new或copy创建一个对象时,此计数器设为1;需要访问此对象时通过retain消息增加1,不再访问时通过release消息减少1。如果计数器为0,则对象被销毁。当对象被销毁时,系统会向该对象发送dealloc消息,可以在对象中重写dealloc方法以释放对象分配的相关资源。一定不要直接调用dealloc方法,系统会自动调用。以下是相关方法的声明:

? - (id) retain; //可以在设置retain之后返回此对象接着直接操作

? - (oneway void) release;

? - (NSUInteger) retainCount; //如果要获得计数器的值,可以发送retainCount消息。

? 对象所有权:如果一个对象内有指向其他对象的实例变量,则称该对象拥有其他这些对象。

? 访问方法中的保留和释放:正确做法是在访问方法中先保留新的对象,再释放旧的对象,最后赋值。例如:

- (void) setEngine: (Engine *) newEngine { [newEngine retain]; [engine release]; engine = newEngine; }

? 自动释放:将所有对象放入池中。Cocoa有一个自动释放池(autorelease pool),是一个用来存放对象的集

合,并且能够自动释放。NSObject类提供了一个叫做autorelease的方法,该方法预先设定了一条会在未来某个时间发送的release消息,其返回值是接收这条消息的对象。当给一个对象发送autorelease消息时,其保留计数器的值并不会发生变化,其实是将该对象添加到了自动释放池中。当自动释放池被销毁时,会向该池中所有对象发送release消息,所有被自动释放的对象都将其保留计数器的值减一。这样可以解决一些不能自动释放或过早释放的问题。例如,一个对象的description方法应该如下编写:

- (NSString *) description { NSString *str = [[NSString alloc] initWithFormat:@”%d”, 4+; return (*str autorelease]); }

? 自动释放池的创建方法:

? 通过@autoreleasepool{}关键字,所有花括号里面的代码都会被放入这个池子,其中的变量无法在括号

外使用。推荐使用此方法。

? 使用NSAutoreleasePool对象,创建和释放NSAutoreleasePool对象之间的代码就会使用这个池子。

? Cocoa的内存管理规则:当使用new、alloc或copy方法创建了一个对象时,则该对象的保留计数器值为1,就

需要通过向该对象发送一条release或autorelease消息来释放该对象。如果通过retain保留了一个对象,就需要release该对象,retain方法和release方法的使用次数要保持相等。除此之外获得的对象,可以认为其保留计数器的值为1,且可以认为它是自动释放的,不需要手动释放。

? 临时对象:如果使用其他方法获得一个对象,比如arrayWithCapacity方法,是不需要关心如何销毁该对象

的。但是这类对象需要记得保留,否则当前事件结束后会被自动释放,等不到dealloc方法释放。

? 全局对象:NSColor类的对象也不需要释放,因为其返回了一个全局共享的单例对象,不需要被销毁。 ? 拥有对象:需要在dealloc方法中释放所拥有的对象。例程:

- (void) dealloc { [array release]; [super dealloc]; }

? 自动释放池被清理的时间:此时间是完全确定的,要么显示地手动销毁,要么在事件循环结束时自动销毁。 ? 自动内存管理机制:垃圾回收。对于已创建和使用的对象,当忘记清理时,系统会自动识别并回收不再使

用的对象。启用此功能:Building Settings=>Required[-fobjc-gc-only]选项。垃圾回收器在事件循环结束时触发,当发现没有任何变量指向某个对象时,该对象即被丢弃。所以,如果不再使用某个对象,需要将指向该对象的实例对象指针赋值为nil。请注意垃圾回收功能只支持OS X应用开发,无法用于iOS开发。实际上在iOS开发中,建议不要使用autorelease方法,也不要使用会返回自动释放对象的一些便利的方法。 ? 自动引用计数ARC(automatic reference counting):在iOS中采用,使用时按需分配并使用对象,编译器会

自动帮助插入retain和release语句。与在运行时工作的垃圾回收器不同,ARC是在编译时工作的。

? 异常:如果要支持异常,要确保-fobj-exceptions项被打开,可启用Enable Objective-C Exceptions项。

? 捕捉不同类型的异常:

@try {

} @catch (MyCustomException *custom) {

} @catch (NSException *exception) {

} @catch (id value) {

} @finally {

}

? 抛出异常:NSException *exception = [NSException exceptionWithName: …]; @throw exception;

对象初始化:Car *car = [[Car alloc] init];

? 分配对象:向某个类发送alloc消息,则分配内存,并初始化为0。

? 初始化对象:调用init方法,返回其正在初始化的对象:(id) init { if(self = [super init]) {……} return (self); } ? 构造便利初始化函数:即一个函数完成所有类成员变量的初始化。例程:

- (id) initWithPressure: (float) pressure tradeDepth: (float) treadDepth , if(self = *super init+) ,……- return

(self); }

本文来源:https://www.bwwdw.com/article/4nkb.html

Top