Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在未初始化的对象(空指针)上调用方法 如果对一个为零的对象(指针)调用一个方法(可能是因为有人忘记初始化它),Objective-C中的正常行为是什么?它不应该产生某种错误(分段错误、空指针异常…) 如果这是正常行为,是否有方法更改此行为(通过配置编译器),以便程序在运行时引发某种错误/异常_Iphone_Objective C_Initialization_Null Pointer - Fatal编程技术网

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
    float
    ,a
    double
    ,a
    长double
    , 或者一个
    long
    ,然后发送一条消息 to
    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}