关于在xcode上写oc语言有id类型、出现ARC forbids explicit message sendof'dealloc'的问题

我们开始学习oc语言时或许会遇见博主这样的问题,当函数的参数类型为id类型时;在进行release,retain相关操作的时候发现提示:ARC forbids explicit message sendof’dealloc’,xcode会像图中这样报错:
1

2
这里写图片描述
我们可以自己在xcode上手动修改某些设置就可以让它正确地编译运行,这是由于在新建工程的时候使用了ARC功能,即点选了“Use Automatic Reference Counting”选项。这个时候,打开“Build Setting”,找到“Objective-C Automatic Reference Counting”项,将它的值设置成“NO”,即可。
如果未找到“Objective-C Automatic Reference Counting”项,则找到”CLANG_ENABLE_OBJC_ARC” 将它的值设置成NO,这样ARC功能就关闭了,如下所示:
这里写图片描述
修改后的设置为:
这里写图片描述
看,没错吧,我们现在可以按下command+R顺利编译运行了:
1、
这里写图片描述
2、
这里写图片描述
让我们看看oc源代码,读者们也可以试试在自己的xcode上运行:
1、

#import <Foundation/Foundation.h>


typedef enum{
    kCircle,
    kRectangle,
    kEgg,
    kTriangle
} ShapeType;

typedef enum{
    kRedColor,
    kGreenColor,
    kBlueColor
} ShapeColor;

typedef struct{
    int x,y,width,height;
} ShapeRect;

typedef struct{
    ShapeType type;
    ShapeColor fillColor;
    ShapeRect bounds;
} Shape;

void drawShapes(id shapes[],int count);
NSString *colorName(ShapeColor colorName);

@interface Circle:NSObject
{
    @private
    ShapeColor fillColor;
    ShapeRect bounds;
}
-(void) setFillColor:(ShapeColor)fillColor;
-(void) setBounds:(ShapeRect)bounds;
-(void) draw;
@end //Circle

@implementation Circle

-(void)setFillColor:(ShapeColor)c
{
    fillColor = c;
}

-(void)setBounds:(ShapeRect)b
{
    bounds = b;
}

-(void)draw
{
    NSLog(@"drawing a circle at (%d %d %d %d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillColor));
}
@end

@interface Rectangle : NSObject
{
    ShapeColor fillColor;
    ShapeRect bounds;
}
-(void)setFillColor:(ShapeColor)fillColor;
-(void)setBounds:(ShapeRect)bounds;
-(void)draw;

@end

@implementation Rectangle
-(void)setFillColor:(ShapeColor)c
{
    fillColor = c;
}
-(void)setBounds:(ShapeRect)b
{
    bounds = b;
}
-(void)draw
{
    NSLog(@"drawing a rectangle at (%d %d %d %d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillColor));
}

@end

@interface Egg : NSObject
{
    ShapeColor fillcolor;
    ShapeRect bounds;
}
-(void)setFillColor:(ShapeColor)fillColor;
-(void)setBounds:(ShapeRect)bounds;
-(void)draw;

@end
@implementation Egg

-(void)setFillColor:(ShapeColor)c
{
    fillcolor = c;
}
-(void)setBounds:(ShapeRect)b
{
    bounds = b;
}
-(void)draw
{
    NSLog(@"drawing a egg at (%d %d %d %d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillcolor));
}

@end

@interface Triangle : NSObject
{
    ShapeColor fillColor;
    ShapeRect bounds;
}
-(void)setFillColor:(ShapeColor)fillColor;
-(void)setBounds:(ShapeRect)bounds;
-(void)draw;

@end //Triangle

@implementation Triangle


-(void)setFillColor:(ShapeColor)c
{
    fillColor = c;
}

-(void)setBounds:(ShapeRect)b
{
    bounds = b;
}

-(void)draw
{
    NSLog(@"drawing a triangle at (%d %d %d %d) in %@",bounds.x,bounds.y,bounds.width,bounds.height,colorName(fillColor));
}

@end

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

    id shapes[4];

    ShapeRect rect0 = {0,0,10,30};
    shapes[0] = [Circle new];
    [shapes[0] setBounds:rect0];
    [shapes[0] setFillColor:kRedColor];

    ShapeRect rect1 = {30,40,50,60};
    shapes[1] = [Rectangle new];
    [shapes[1] setBounds:rect1];
    [shapes[1] setFillColor:kGreenColor];

    ShapeRect rect2 = {15,19,37,29};
    shapes[2] = [Egg new];
    [shapes[2] setBounds:rect2];
    [shapes[2] setFillColor:kBlueColor];

    ShapeRect rect3 = {47,32,80,50};
    shapes[3] = [Triangle new];
    [shapes[3] setBounds:rect3];
    [shapes[3] setFillColor:kRedColor];
    drawShapes(shapes,4);

    return 0;
}

void drawShapes(id shapes[],int count)
{
    for(int i = 0;i < count;i++)
    {
        [shapes[i] draw];
    }
}

NSString *colorName(ShapeColor colorName)
{
    switch(colorName){
        case kRedColor:
            return @"red";
            break;
        case kGreenColor:
            return @"green";
            break;
        case kBlueColor:
            return @"blue";
            break;
    }
    return @"no clue";
}

2、

#import <Foundation/Foundation.h>


@interface RetainTracker : NSObject

@end
@implementation RetainTracker

-(id)init
{
    if(self = [super init])
    {
        NSLog(@"init:Retain count of %lu",[self retainCount]);
    }
    return (self);
}

-(void)dealloc
{
    NSLog(@"dealloc called.Bye Bye.");
    [super dealloc];
}

@end


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

    RetainTracker *tracker = [RetainTracker new];//count:1

    [tracker retain];//count:2
    NSLog(@"%lu",(unsigned long)[tracker retainCount]);

    [tracker retain];//count:3
    NSLog(@"%lu",(unsigned long)[tracker retainCount]);

    [tracker release];//count:2
    NSLog(@"%lu",(unsigned long)[tracker retainCount]);

    [tracker release];//count:1
    NSLog(@"%lu",(unsigned long)[tracker retainCount]);

    [tracker retain];//count:2
    NSLog(@"%lu",(unsigned long)[tracker retainCount]);

    [tracker release];//count:1
    NSLog(@"%lu",(unsigned long)[tracker retainCount]);

    [tracker release];

    return 0;
}

如果有问题,欢迎各位指出,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值