返回选择器上的CGRect会导致崩溃

时间:2014-11-18 12:15:40

标签: ios objective-c cgrect cgpoint

我有以下代码:

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // Does not crash
    //[self performSelector:@selector(dummyRectValue)];

    // Does not crash
    [self performSelector:@selector(dummyPoint)];

    // Crash
    [self performSelector:@selector(dummyRect)];

}

- (NSValue*) dummyRectValue
{
    return [NSValue valueWithCGRect:CGRectMake(0.0f, 0.0f, 0.0f, 0.0f)];
}

- (CGRect) dummyRect
{
    return CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
}

- (CGPoint) dummyPoint
{
    return CGPointMake(0.0f, 0.0f);
}

@end

目前,调用[self performSelector:@selector(dummyRect)]会导致崩溃。

任何帮助,了解我做错了什么?

提前致谢,

3 个答案:

答案 0 :(得分:2)

perfomSelector是一个NSObject方法。您可以在Apple doc中找到它:

   - (id)performSelector:(SEL)aSelector

你可以看到,它只返回对象(id),你正在尝试它返回一个C结构(CGRect)

你可以这样做:

   [self dummyRect];

答案 1 :(得分:-1)

在objective-C中,您无法返回CGRect。所以你必须将CGRect转换为NSValue。 所以你得到崩溃报告。 这是Objective-C的一个基本限制 - 变量有时不能保存对象,有时也不能保持原始值。最好的解决方法是返回包含要返回的实际值的NSNumber或NSValue对象。

答案 2 :(得分:-1)

在objective-C中,您不能将CGRect作为参数发送,因此您需要将CGRect转换为NSValue。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // Does not crash
    //[self performSelector:@selector(dummyRectValue)];

    // Does not crash
    [self performSelector:@selector(dummyPoint)];

    // Crash
    [self performSelector:@selector(dummyRect)];

}


 //Return CGRect as NSValue
    - (NSValue *)dummyRect
    {
        return [NSValue valueWithCGRect:CGRectMake(0.0f, 0.0f, 0.0f, 0.0f)];
    }