解决方案 »

  1.   

    出以这一句上
    myFraction=[Fraction alloc]; 这时只是分配了内存,并没有初始化。所以不能这样赋值。
      

  2.   

    呵呵,找到问题了,抄错原码了,在alloc时要写类的名字,在init时要写实例的名字,未注意,现在明白了,感谢回复
      

  3.   

    alloc方法
    根据苹果的官方文档。当对象创建时,cocoa会从应用程序的虚拟地址空间上为该对象分配足够的内存。cocoa会遍历该对象所有的成员变量,通过成员变量的类型来计算所需占用的内存。当我们通过alloc或allocWithZone方法创建对象时,cocoa会返回一个未”初使化“过的对象。在这个过程中,cocoa除了上面提到的申请了一块足够大的内存外,还做了以下3件事: 1. 将该新对象的引用计数(Retain Count)设置成1。
     2. 将该新对象的isa成员变量指向它的类对象。
     3. 将该新对象的所有其它成员变量的值设置成零。(根据成员变量类型,零有可能是指nil或Nil或0.0)isa成员变量是在NSObject中定义的,所以保证Cocoa的所有对象都带有此成员变量。借助该变量可以实现Cocoa对象在运行时的自省(Introspection)功能。
      

  4.   

    init方法大部分情况下,我们都不希望所有成员变量都是零,所以init方法会做真正的初使化工作,让对象的成员变量的值符合我们程序逻辑中的初始化状态。例如,NSMutableString可能就会额外再申请一块字符数组,用于动态修改字符串。init还有一个需要注意的问题。某些情况下,init会造成alloc的原本空间不够用,而第二次分配内存空间。所以下面的写法是错的:复制代码
    NSString * s = [NSString alloc];[s init]; // 这儿init返回的地址可能会变。s原本的指针地址可能是无效的地址。
    为此,苹果引入了一个编程规范,让大家写的时候将alloc 和init写在一行。所以上面的代码正确的写法是复制代码
    NSString * s = [[NSString alloc] init];