1

我想创建一个由 CGRect 指针数组组成的属性,数字在开头没有定义,所以我想创建一个指向包含该指针数组开头的内存区域的指针。这似乎很困难,我已经看到了不同的答案并以此为基础。
到目前为止,我已经写过:

@interface ViewController ()
@property (assign) CGRect * rectArray;
@property (strong, nonatomic) NSArray * hotspots;
@end

@implementation ViewController



- (CGRect *) createRectArray {
    int count = _hotspots.count;
    _rectArray = malloc(sizeof(CGRect*)*count);
    for (int i = 0; i<count; i++) {
        CGRect currentFrame = ((UIView*)_hotspots[i]).frame;
        _rectArray[i] = &currentFrame;
    }

    return _rectArray;
}
@end

但编译器抱怨告诉我分配不正确。

我猜可能正确的变量不是CGRect * rectArray,而是双重间接CGRect ** rectArray。
那是对的吗?
[更新]
实际上我想做的事情没有意义......因为属性 -frame 返回 CGRect 的副本而不是指向它的指针,所以我直接快速访问它的想法已经不复存在。

4

2 回答 2

1

以下代码rectArray正确访问。

@interface ViewController ()
//array of pointers 
@property (assign) CGRect **rectArray;
@property (strong, nonatomic) NSArray * hotspots;
@end

@implementation ViewController


- (CGRect **) createRectArray {
    int count = _hotspots.count;
    _rectArray = malloc(sizeof(CGRect*)*count);

    for (int i = 0; i<count; i++) {
        //this will never work, the frame returned from UIView is a temporary which will get released!
        CGRect currentFrame = ((UIView*)_hotspots[i]).frame;
        _rectArray[i] = &currentFrame;
    }

    return _rectArray;
}

- (void)dealloc {
   free(_rectArray);
}
@end

但是,正如我在评论中所写的那样,这是行不通的。[UIView frame]返回一个 C 结构。NSInteger这与原始变量(等)的行为相同long。它被复制了。&currentFrame是对本地堆栈变量的引用,当代码超出范围(for迭代结束,方法结束)时,它将被释放。它不会做你所期望的。访问存储的指针将使您的应用程序崩溃。

您期望的功能可以通过以下两种方法轻松完成

- (void)setFrame:(CGRect)frame forHotspotAtIndex:(NSUinteger)index {
    UIView* hotspot = [self.hotspots objectAtIndex:index];
    hotspot.frame = frame;
}

- (CGRect)frameForHotspotAtIndex:(NSUinteger)index {
    UIView* hotspot = [self.hotspots objectAtIndex:index];
    return hotspot.frame;
}
于 2013-05-22T11:58:29.583 回答
1

如果你正在分配一个 CGRects 数组,那么malloc(sizeof(CGRect*)*count)当你试图分配一个指向 CGRect 的指针数组时是错误的。
此外,当我们将 CGRect 分配给数组时,我们不需要获取它的指针,_rectArray[i] = currentFrame应该可以正常工作。

以下代码应该适合您:

@interface ViewController ()
@property (assign) CGRect * rectArray;
@property (strong, nonatomic) NSArray * hotspots;
@end

@implementation ViewController

- (CGRect *) createRectArray {
    int count = _hotspots.count;
    _rectArray = malloc(sizeof(CGRect)*count);
    for (int i = 0; i<count; i++) {
        CGRect currentFrame = ((UIView*)[_hotspots objectAtIndex:i]).frame;
        _rectArray[i] = currentFrame;
    }

    return _rectArray;
}
@end
于 2013-05-22T11:46:46.823 回答