在未初始化的对象上调用方法(空指针)
- 如果你在一个为零的对象(指针)上调用一个方法(可能是因为有人忘记初始化它),Objective-C 中的正常行为是什么?它不应该产生某种错误(分段错误、空指针异常...)吗?
- 如果这是正常行为,是否有办法改变这种行为(通过配置编译器)以便程序在运行时引发某种错误/异常?
为了更清楚我在说什么,这里有一个例子。
拥有这个类:
@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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
发送到
nil
对象的消息在 Objective-C 中是完全可以接受的,它被视为无操作。无法将其标记为错误,因为它不是错误,事实上它可能是该语言的一个非常有用的功能。来自文档:
A message sent to a
nil
object is perfectly acceptable in Objective-C, it's treated as a no-op. There is no way to flag it as an error because it's not an error, in fact it can be a very useful feature of the language.From the docs:
来自 Greg Parker 的 站点:
如果运行 LLVM 编译器 3.0 (Xcode 4.2) 或更高版本
From Greg Parker's site:
If running LLVM Compiler 3.0 (Xcode 4.2) or later
您应该清楚的一件事是,在 Objective-C 中,您不是在对象上调用方法,而是向对象发送消息。运行时将找到该方法并调用它。
自 Objective-C 的第一个版本以来,nil 消息始终是返回 nil 的安全无操作。有很多代码依赖于这种行为。
One thing you should be clear on is that in Objective-C, you don't call a method on an object, you send a message to an object. The runtime will find the method and call it.
Since the first versions of Objective-C, a message to nil has always been a safe no-op that returns nil. There's a lot of code that depends on this behavior.
什么也没发生。当你向nil发送消息时,意味着没有接收者
然后消息就飞走了。
objc_msgSend
方法是从Runtime
库使用的。使用了消息调度
机制,这就是为什么Objective-C
有所不同,基于这个原理有很多优点。它不会像 Java 或 Swift 那样抛出任何错误Nothing happened. When you send a message to nil it means that there is no receiver
and the message fly away.
objc_msgSend
method is used fromRuntime
library.Message dispatch
mechanism is used that is whyObjective-C
is different and there are a lot of advantages are based on this principle. It will not throws any errors asJava
orSwift
do