Objective-C属性表达式的地址

时间:2014-12-14 10:56:19

标签: objective-c objective-c-runtime objective-c-2.0

我需要属性的访问地址但有问题。示例代码是

@interface Rectangle : NSObject
{
    SDL_Rect wall;
    SDL_Rect ground;
}
@property SDL_Rect wall;
@property SDL_Rect ground;
@end

@implementation Rectangle
@synthesize x;
@synthesize y;
@end

@interface Graphics : NSObject
{
    int w;
    int h;
}
-(void) drawSurface
@end

@implementation Graphics
-(void) drawSurface
{
    Rectangle *rect = [[Rectangle alloc] init];
    SDL_BlitSurface(camera, NULL, background, &rect.wall);
}
@end

& rect.x是请求的属性表达式的地址

3 个答案:

答案 0 :(得分:8)

如评论所示,您无法获取房产的地址。属性实际上只是一个承诺,有问题的对象为某些值提供了访问器。值本身可能甚至不存在于实例变量中。例如,名为fullName的属性的getter可以通过连接firstNamelastName属性的值来动态生成所需的值。

由于您需要将SDL_Rect的地址传递给SDL_BlitSurface(),您可以先将必要的属性复制到局部变量中,然后传递该变量的地址:

Rectangle *rect = [[Rectangle alloc] init];
SDL_Rect wall = rect.wall;
SDL_BlitSurface(camera, NULL, background, &wall);

如果您需要在调用wall后保留SDL_BlitSurface()中留下的值,请在通话后再将其复制回来:

rect.wall = wall;

答案 1 :(得分:0)

请求的属性表达式的地址意味着:

@preperty (nonatomic,copy) NSString *name;

如果您想获取self.name的地址。你不能写这样的代码:

NSLog (@"%p",&(self.name));

因为事实上,self.name是getter方法,如下所示:

- (NSString *)name {
    return _name;
}

所以你无法得到方法的地址。

答案 2 :(得分:0)

我有类似的情况需要访问父类中定义的CGAffineTransform的子类。答案来自@ orp​​heist对这个问题的回答:Get the address of an Objective-c property (which is a C struct)。它确实涉及向Rectangle类添加方法。

@interface Rectangle : NSObject
{
    NSRect wall;
    NSRect ground;
}
@property NSRect wall;
@property NSRect ground;
@end

@implementation Rectangle
@synthesize wall = _wall; //x;
@synthesize ground = _ground; //y;

- (const NSRect *) addressOfWall {
    return &_wall;
}

- (const NSRect *) addressOfGround {
    return &_ground;
}

+(instancetype)standardRectangle
{
    Rectangle *newInstance = [[self alloc] init];
    newInstance.wall = NSMakeRect(0,0, 300, 100);
    newInstance.ground = NSMakeRect(0 ,0, 300, 450);
    return newInstance;
}
@end

现在你可以使用例如addressOfWall:

- (void)testWall
{
    Rectangle *rect = [Rectangle standardRectangle];
    XCTAssertEqual(100, [rect addressOfWall]->size.height);
}