Iphone 在未初始化的对象(空指针)上调用方法 如果对一个为零的对象(指针)调用一个方法(可能是因为有人忘记初始化它),Objective-C中的正常行为是什么?它不应该产生某种错误(分段错误、空指针异常…) 如果这是正常行为,是否有方法更改此行为(通过配置编译器),以便程序在运行时引发某种错误/异常
为了更清楚地说明我在说什么,这里有一个例子 有这门课:Iphone 在未初始化的对象(空指针)上调用方法 如果对一个为零的对象(指针)调用一个方法(可能是因为有人忘记初始化它),Objective-C中的正常行为是什么?它不应该产生某种错误(分段错误、空指针异常…) 如果这是正常行为,是否有方法更改此行为(通过配置编译器),以便程序在运行时引发某种错误/异常,iphone,objective-c,initialization,null-pointer,Iphone,Objective C,Initialization,Null Pointer,为了更清楚地说明我在说什么,这里有一个例子 有这门课: @interface Person : NSObject { NSString *name; } @property (nonatomic, retain) NSString *name; - (void)sayHi; @end 通过这种实施: @implementation Person @synthesize name; - (void)dealloc { [name release]; [sup
@interface Person : NSObject {
NSString *name;
}
@property (nonatomic, retain) NSString *name;
- (void)sayHi;
@end
通过这种实施:
@implementation Person
@synthesize name;
- (void)dealloc {
[name release];
[super dealloc];
}
- (void)sayHi {
NSLog(@"Hello");
NSLog(@"My name is %@.", name);
}
@end
在程序的某个地方,我会这样做:
Person *person = nil;
//person = [[Person alloc] init]; // let's say I comment this line
person.name = @"Mike"; // shouldn't I get an error here?
[person sayHi]; // and here
[person release]; // and here
发送到
nil
对象的消息在Objective-C中是完全可以接受的,它被视为no-op。无法将其标记为错误,因为它不是错误,事实上它可能是该语言非常有用的功能
从:
向nil发送消息
在Objective-C中,发送
消息为零,它根本没有效果
在运行时。有几种模式
在可可中,他们利用了这一点
事实从
发送给nil的消息也可能有效:
- 如果该方法返回一个对象,那么发送到
的消息将返回nil
(0
),例如:nil
Person*motherInLaw=[[个人配偶]母亲]代码> 如果
的aPerson
配偶
为
, 然后,nil
被发送到mother
,然后 方法返回nil
nil
- 如果该方法返回任何指针类型,则返回任何小于
小于或等于[code>sizeof(void*),a
,afloat
,adouble
, 或者一个长double
,然后发送一条消息 tolong
返回nil
0
- 如果该方法返回Mac OS X ABI定义的
要在中返回的函数调用指南 注册,然后将消息发送到结构
为中的每个字段返回nil
数据结构。其他0.0
数据类型将不填充 零struct
- 如果该方法返回除上述值以外的任何值 键入消息的返回值 发送到nil的未定义
有一点您应该清楚,在Objective-C中,您不需要对对象调用方法,而是向对象发送消息。运行库将找到该方法并调用它 自Objective-C的第一个版本以来,发送给nil的消息始终是返回nil的安全no op。有许多代码依赖于此行为。来自的: 如果运行LLVM编译器3.0(Xcode 4.2)或更高版本 返回类型为| return的发送到nil的消息 最多64位的整数| 0 浮点数最大为长双精度| 0.0 指针|零 结构|{0} 任意_复杂类型|{0,0}
什么也没发生。当您向nil发送消息时,表示没有接收者
信息飞走了
objc_msgSend
方法是从运行时
库中使用的<代码>消息分派机制被使用,这就是为什么Objective-C
不同的原因,并且基于此原理有很多优点。它不会像Java
或Swift
do那样抛出任何错误,我不知道有什么方法可以改变这种行为。这是使用Objective-C/Cocoa编程的基本部分。你将学会爱它。
Messages to nil with return type | return
Integers up to 64 bits | 0
Floating-point up to long double | 0.0
Pointers | nil
Structs | {0}
Any _Complex type | {0, 0}