在学习移动互联Objective C视频,内存管理部门时遇到一个问题,下边红色的代码,视频中显示调试是会出错的,因为在调用[[apply cpu] CId]之前 cpu所指向的对象已经被释放,可是我照着视频中的代码做,怎么调试都是运行正常,不出错,奇了怪了,难呢是因为我的XCode是最新版的,请求高手解答。
#import <Foundation/Foundation.h>
#import "CPU.h"
#import "Laptop.h"
int main(int argc, const char * argv[])
{
    @autoreleasepool {        
        // insert code here...
        NSLog(@"Hello, World!");
 
        CPU *powerPC = [[CPU alloc] init]; //创建CPU对象
        [powerPC setCID:101]; //设置CID
 
        Laptop *apple = [[Laptop alloc]init]; //创建Laptop对象
        [apple setCPU:powerPC]; //设置CPU对象
      
        [powerPC release]; //释放CPU对象
        NSLog(@"apple cpu id:%d",[[apple cpu] CID]); //调用已经被释放了的对象的方法
    
    }
    return 0;
}下边是类的声明和定义 
//CPU.h
#import <Foundation/Foundation.h>
@interface CPU : NSObject
{
  @private    int _cID;
}
- (void) setCID:(int) cID;
- (int) CID;
@end//CPU.m
#import "CPU.h"
@implementation CPU
- (void) setCID:(int) cID
{ _cID = cID; }
- (int) CID
{  return _cID; }//Laptop.h
#import <Foundation/Foundation.h>
@class CPU;
@interface Laptop : NSObject
{
@private
    CPU *_cpu;
}
- (void) setCPU:(CPU *) cpu;
- (CPU*) cpu;
@end//Laptop.m
#import "Laptop.h"
@implementation Laptop
- (void) setCPU:(CPU *) cpu
{
    _cpu = cpu;
}
- (CPU*) cpu
{
   return _cpu;
}
-(void) dealloc
{
  NSLog(@"laptop dead");
  [super dealloc];
}
@end

解决方案 »

  1.   

    XCode Version 4.5.2 (4G2008a)
      

  2.   

    你释放的是powerPC,并不是apple 
      

  3.   

    [[apple cpu] CID] 这个是先获取cpu对象,然后再调用cpu对明的CID, apple 中的cpu 和powerPC其实是同一个对象,他们指向内存中的同一块区域。已经联系上视频的作者了,他表示,在控制台下边,有时候对象已经release了,但方法还可以调,但到UI的时候就不是这样了。