2014-12-14 3 views
2

Мне нужен адрес доступа к собственности, но у вас есть проблема. Пример кодаObjective-C Адрес выражения свойства

@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 является адрес выражения недвижимости просил

+1

Вы не можете, это свойство. – Andy

+0

SDL_BlitSurface (камера, NULL, фон, <это должен быть CGRect здесь>); - последним требуемым параметром является CGRect, а не только значение x. – Mrunal

+0

См. Https://wiki.libsdl.org/SDL_BlitSurface – Mrunal

ответ

5

В комментарии предполагают, вы не можете взять адрес свойства. Свойство действительно просто обещание, что объект, о котором идет речь, предоставляет аксессурам для некоторой ценности. Само значение может быть или даже не существовать в переменной экземпляра. Например, получатель для свойства, называемого fullName, может генерировать требуемое значение «на лету», объединяя значения 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; 
0

Адрес выражения недвижимости запрошенной , что мне анс

@preperty (nonatomic,copy) NSString *name;

, если вы хотите, чтобы получить адрес self.name; вы не можете писать код, как этот

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

Потому что на самом деле, self.name является метод геттер, как этот

- (NSString *)name { 
 
    return _name; 
 
}

так вы не может получить адрес метода.

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); 
} 
Смежные вопросы