Code Bye

关于oc定义的一些问题

 
//
//  Fraction.m
//  Fraction
//
//  Copyright (c) 2015年 MC207. All rights reserved.
//

#import "Fraction.h"

@implementation Fraction

@synthesize numerator,denominator;

-(void) print
{
    NSLog(@"%i/%i",numerator,denominator);
}
@end

//
//  Fraction.m
//  Fraction
//
//  Copyright (c) 2015年 MC207. All rights reserved.
//

#import "Fraction.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        Fraction *a;
        Fraction *b;
        int c,d;
        [a print];
        [b print];
        NSLog(@"%i/%i",a.numerator,a.denominator);
        NSLog(@"%i/%i",[b numerator],[b denominator]);
        NSLog(@"%i",c);
        NSLog(@"%i",d+1);
        if (!a) {
            NSLog(@"123");
        }

    }
    return 0;
}

2015-03-06 00:48:15.387 Fraction[1380:303] 0/0
2015-03-06 00:48:15.389 Fraction[1380:303] 0/0
2015-03-06 00:48:15.391 Fraction[1380:303] 0
2015-03-06 00:48:15.392 Fraction[1380:303] 1
2015-03-06 00:48:15.393 Fraction[1380:303] 123

a和b并没有初始化只是定义为Fraction类的对象 NSLog的两条分明显示了a和b的两个实例变量为0和0,但是为什么a和b调用print方法却显示不了呢(其实质还是调用a和b的取值方法啊)?还有局部变量c和d也没有初始化 但是显然好像初始化为0了 我记得书上说局部变量没有默认的初始值 使用前要先赋值才可以 这又是为什么呢?求大神详细解答下 小弟刚学 如果发帖位置不对 请告知应该发往哪个版块 谢谢

你说对了一些,变量都没有初始化,但是编译器是有优化的,a和b被初始化为nil(a、b不是一个脏指针),c、d被初始化成0,虽然没有运行时的问题,但这不是一种好的编程习惯。那后面的就好理解了,a、b是空对象,向空对象发消息(print)返回的也是空(nil == 0),简单值也是当0处理。

补充一点,你用GCC4、LLVM GCC、LLVM 这三个编译器分别编译可能遇到不同的结果,并不是每个编译器都会帮你做默认初始化的。

新人路过看看

自己要明确自己的行为,不要指望编译器做出符合自己预期的默认初始化。

引用 1 楼 zhangao0086 的回复:

你说对了一些,变量都没有初始化,但是编译器是有优化的,a和b被初始化为nil(a、b不是一个脏指针),c、d被初始化成0,虽然没有运行时的问题,但这不是一种好的编程习惯。那后面的就好理解了,a、b是空对象,向空对象发消息(print)返回的也是空(nil == 0),简单值也是当0处理。

补充一点,你用GCC4、LLVM GCC、LLVM 这三个编译器分别编译可能遇到不同的结果,并不是每个编译器都会帮你做默认初始化的。

感谢斑竹大大!现在我知道了编译器对此进行了优化,a和b被初始化为nil,那nil即空和0有什么区别吗,比如和后面int c,d被初始化为0比起来,还有简单值也是当0处理怎么理解?[a numerator];结果为0,[a print];没有结果或说没有反应,是因为print方法返回空(就不输出结果了),而numerator方法当0处理(就输出0的结果)?这样吗

引用 3 楼 hslinux 的回复:

自己要明确自己的行为,不要指望编译器做出符合自己预期的默认初始化。

我只是有意测试一下 在实际编写时不会这样去做 就是想知道 同样是[a numerator];就可以得到值为0,而[a print];却得不到任何值,print内部其实就是用numerator方法写的


40分
[a print]当然会什么都得不到,因为没有进入print方法中(a 对象是空的)。
a对象既然不存在(初始化为nil),那么其内存地址就是0x00000000,所以说nil == 0;简单类型都是初始为0的,int = 0, long = 0, float  = 0.0f,bool = false 等等
引用 6 楼 zhangao0086 的回复:

[a print]当然会什么都得不到,因为没有进入print方法中(a 对象是空的)。
a对象既然不存在(初始化为nil),那么其内存地址就是0x00000000,所以说nil == 0;简单类型都是初始为0的,int = 0, long = 0, float  = 0.0f,bool = false 等等

太感谢了 终于搞懂了


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于oc定义的一些问题