我需要属性的访问地址但有问题。示例代码是
@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是请求的属性表达式的地址
答案 0 :(得分:8)
如评论所示,您无法获取房产的地址。属性实际上只是一个承诺,有问题的对象为某些值提供了访问器。值本身可能甚至不存在于实例变量中。例如,名为fullName
的属性的getter可以通过连接firstName
和lastName
属性的值来动态生成所需的值。
由于您需要将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的子类。答案来自@ orpheist对这个问题的回答: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);
}