Weitere ähnliche Inhalte
Ähnlich wie Objective-C が好きになる Tips & Hack (20)
Mehr von Taketo Sano (17)
Objective-C が好きになる Tips & Hack
- 4. 初心者あるある
// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
myView.frame.origin.x += 10;
}];
- 5. 初心者あるある
// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
myView.frame.origin.x += 10;
}];
え?
- 6. 正しくは、
// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
CGRect frame = myView.frame;
frame.origin.x += 10;
myView.frame = frame;
}];
- 7. または、
// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
myView.frame =
CGRectMake(myView.frame.origin.x + 10,
myView.frame.origin.y,
myView.frame.size.width,
myView.frame.size.height);
}];
- 8. あるいは、
// myView を右に 10pt 移動
[UIView animateWithDuration:0.25 animations:^{
myView.frame =
CGRectOffset(myView.frame, 10, 0);
}];
- 21. 2) カテゴリで勝手にクラスを拡張できる
// frame を使って getter / setter を定義
@implementation UIView(TSExtension)
- (CGFloat)x
{
return self.frame.origin.x;
}
- (void)setX:(CGFloat)x
{
CGRect frame = self.frame;
frame.origin.x = x;
self.frame = frame;
}
@end
UIView+TSExtension.m
- 39. NSNull サイレンサーを実装
#import <objc/runtime.h>
@implementation NSNull (TSSilencer)
- (void *)silentGetter
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
return nil;
}
- (void)silentSetter:(void *)value
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
}
...(続く)
- 40. NSNull サイレンサーを実装
#import <objc/runtime.h>
@implementation NSNull (TSSilencer)
- (void *)silentGetter
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
return nil;
}
nil を返すだけの getter
- (void)silentSetter:(void *)value
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
}
...(続く)
- 41. NSNull サイレンサーを実装
#import <objc/runtime.h>
@implementation NSNull (TSSilencer)
- (void *)silentGetter
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
return nil;
}
- (void)silentSetter:(void *)value
{
NSLog(@"called: [NSNull %@]", NSStringFromSelector(_cmd));
}
何もしない setter
...(続く)
- 42. NSNull サイレンサーを実装
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
NSString *selName = NSStringFromSelector(sel);
if([selName hasPrefix:@"set"]) {
Method setter =
class_getInstanceMethod(self, @selector(silentSetter:));
class_addMethod(self, sel,
method_getImplementation(setter),
method_getTypeEncoding(setter));
}
} else {
Method getter =
class_getInstanceMethod(self, @selector(silentGetter));
class_addMethod(self, sel,
method_getImplementation(getter),
method_getTypeEncoding(getter));
}
return YES;
- 43. NSNull サイレンサーを実装
未定義のメッセージ受信時に必ず呼ばれる
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
NSString *selName = NSStringFromSelector(sel);
if([selName hasPrefix:@"set"]) {
Method setter =
class_getInstanceMethod(self, @selector(silentSetter:));
class_addMethod(self, sel,
method_getImplementation(setter),
method_getTypeEncoding(setter));
}
} else {
Method getter =
class_getInstanceMethod(self, @selector(silentGetter));
class_addMethod(self, sel,
method_getImplementation(getter),
method_getTypeEncoding(getter));
}
return YES;
- 44. NSNull サイレンサーを実装
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
NSString *selName = NSStringFromSelector(sel);
if([selName hasPrefix:@"set"]) {
Method setter =
class_getInstanceMethod(self, @selector(silentSetter:));
class_addMethod(self, sel,
method_getImplementation(setter),
method_getTypeEncoding(setter));
}
} else {
set*** なら silentSetter:
Method getter =
class_getInstanceMethod(self, @selector(silentGetter));
class_addMethod(self, sel,
method_getImplementation(getter),
method_getTypeEncoding(getter));
}
return YES;
を呼ばせ、
- 45. NSNull サイレンサーを実装
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
NSString *selName = NSStringFromSelector(sel);
if([selName hasPrefix:@"set"]) {
Method setter =
class_getInstanceMethod(self, @selector(silentSetter:));
class_addMethod(self, sel,
method_getImplementation(setter),
method_getTypeEncoding(setter));
}
} else {
Method getter =
class_getInstanceMethod(self, @selector(silentGetter));
class_addMethod(self, sel,
method_getImplementation(getter),
method_getTypeEncoding(getter));
}
return YES;
それ以外は silentGetter を呼ばせる。
- 48. こんなのも行ける
NSString *str = (id)[NSNull null];
NSLog(@"string: %@",
[str stringByAppendingString:@"hoge"]);
NSArray *arr = (id)[NSNull null];
NSLog(@"array: %@", arr[1]);
NSDictionary *dic = (id)[NSNull null];
NSLog(@"dic: %@", dic[@"key"]);