2015-02-24 4 views
2

Когда я просматриваю API Touch Cocoa, я могу найти некоторые классы, объявленные вместе с категориями в том же заголовочном файле, например.Расширение класса и класса (категория) в том же заголовочном файле

@interface NSArray : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration> 

@property (readonly) NSUInteger count; 
// and some other properties 

@end 

@interface NSArray (NSExtendedArray) 

@property (readonly, copy) NSString *description; 
// and some other properties 

@end 

Теперь я пытаюсь сделать то же самое с моим классом, как следующий:

@interface ARCTextbook : NSObject 

@property (nonatomic) NSInteger ID; 
@property (nonatomic) NSString *name; 

@end 

@interface ARCTextbook (Student) 

@property (nonatomic) NSInteger studentID; 
@property (nonatomic, getter=isUsed) BOOL used; // Used by a student? 

@end 

Однако, когда я попытался получить доступ к studentID или used собственности, я непризнанная ошибка выбора. Я что-то пропустил?

Cheers.

ответ

1

Это связано объекты, вы можете обратиться в документации ниже:

http://www.davidhamrick.com/2012/02/12/Adding-Properties-to-an-Objective-C-Category.html

How to store not id type variable use a objc_getAssociatedObject/objc_setAssociatedObject?

ARCTextbook.h

#import <Foundation/Foundation.h> 

@interface ARCTextbook : NSObject 
@property (nonatomic) NSInteger ID; 
@property (nonatomic) NSString *name; 
@end 

@interface ARCTextbook (Student) 

@property (nonatomic) NSInteger studentID; 
@property (nonatomic, getter=isUsed) BOOL used; // Used by a student? 

@end 

ARCTextbook.m

#import "ARCTextbook.h" 
#import <objc/runtime.h> 

@implementation ARCTextbook 

@end 

static NSString *kStudentID = @"kStudentID"; 
static NSString *kUsed = @"kUsed"; 

@implementation ARCTextbook (Student) 
@dynamic studentID; 
@dynamic used; 

- (void)setStudentID:(NSInteger)aStudentID { 
    objc_setAssociatedObject(self, (__bridge const void *)(kStudentID), @(aStudentID), OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

- (NSInteger)studentID { 
    return [objc_getAssociatedObject(self, (__bridge const void *)(kStudentID)) integerValue]; 
} 

- (void)setUsed:(BOOL)aUsed { 
    objc_setAssociatedObject(self, (__bridge const void *)(kUsed), @(aUsed), OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

- (BOOL)isUsed { 
    return [objc_getAssociatedObject(self, (__bridge const void *)(kUsed)) boolValue]; 
} 

@end 

ViewController.m

#import "ViewController.h" 
#import "ARCTextbook.h" 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Do any additional setup after loading the view. 
    ARCTextbook *t = [[ARCTextbook alloc] init]; 
    t.studentID = 2; 
    t.used = YES; 

} 

@end 
+1

Вы пробовали запустить код? Я обнаружил непризнанную ошибку селектора во время выполнения. – Andree

+1

Привет, спасибо за ответ. Я думаю, что нет возможности обойти это, но использовать связанный объект! – Andree

Смежные вопросы