【问题标题】:Objective-C and Macros in initwithFrameObjective-C 和 initwithFrame 中的宏
【发布时间】:2014-05-08 06:32:40
【问题描述】:

我尝试使用宏使更改更灵活地添加新项目。 但不知何故,框架不会是我预期的大小。如果我将 ANNOMENUV_NUMBER_OF_ITEMS 直接更改为 5,那么它将按预期工作。谁能告诉我为什么会这样?

#define ANNOMENUV_ITEMS @[@"Text",@"Font",@"Bold",@"Italic",@"Underline",@"Color"]
#define ANNOMENUV_NUMBER_OF_ITEMS [ANNOMENUV_ITEMS count]-1
#define ANNOMENUV_ITEM_WIDTH 45
#define ANNOMENUV_ITEM_CLOSE_WIDTH 45

- (id)initWithFrame:(CGRect)frame{

    //returns correctly the 5 items
    NSLog(@"Count %d",ANNOMENUV_NUMBER_OF_ITEMS);

    self = [super initWithFrame:CGRectMake(frame.origin.x, frame.origin.y,ANNOMENUV_ITEM_WIDTH*ANNOMENUV_NUMBER_OF_ITEMS+ANNOMENUV_ITEM_CLOSE_WIDTH, ANNOMENUV_SIZE_HEIGHT)];

    if (self) {
        self.items = [NSMutableArray arrayWithArray: ANNOMENUV_ITEMS];
    }
    return self;
}

【问题讨论】:

    标签: objective-c ios7 macros


    【解决方案1】:

    试试这个,

    #define ANNOMENUV_NUMBER_OF_ITEMS ([ANNOMENUV_ITEMS count]-1)
    

    但是,为什么?

    这些宏在编译期间被简单地替换在相应的位置。所以编译后你的实际初始化行将如下所示(暂时忽略我上面的答案)。

    考虑 ANNOMENUV_SIZE_HEIGHT = 35

    self = [super initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, 45*[@[@"Text",@"Font",@"Bold",@"Italic",@"Underline",@"Color"] count]-1+ 45, 35)];
    

    现在如果你回忆一下运算符优先级,你就会明白为什么你的代码失败了。

    【讨论】:

    • 谢谢,它有效。但是你能告诉我为什么会这样吗?
    • 避免过度使用宏的原因之一。
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2011-04-16
    相关资源
    最近更新 更多