我们开始学习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;
}
如果有问题,欢迎各位指出,谢谢!