相关疑难解决方法(0)

使用Objective-C中的类别覆盖方法

我可以使用类类别来覆盖已使用类别实现的方法吗?像这样:

1)原始方法

-(BOOL) method {
  return true;
}
Run Code Online (Sandbox Code Playgroud)

2)覆盖方法

-(BOOL) method {
  NSLog(@"error?"); 
  return true; 
}
Run Code Online (Sandbox Code Playgroud)

这会起作用,还是非法的?

objective-c categories

87
推荐指数
3
解决办法
5万
查看次数

通过ObjC类覆盖一个方法并调用默认实现?

使用类别时,您可以使用自己的方式覆盖实现方法,如下所示:

// Base Class 
@interface ClassA : NSObject 
- (NSString *) myMethod;
@end
@implementation ClassA
- (NSString*) myMethod { return @"A"; }
@end

//Category
@interface ClassA (CategoryB) 
- (NSString *) myMethod;
@end
@implementation ClassA (CategoryB)
- (NSString*) myMethod { return @"B"; }
@end
Run Code Online (Sandbox Code Playgroud)

在包含类别之后调用方法"myMethod"将结果"B".

myMethod的Category实现调用原始Class A myMethod的最简单方法是什么?尽管我可以理解,你必须使用低级调用来获取A类的原始方法钩子并调用它,但似乎在语法上更容易实现这一点.

objective-c

47
推荐指数
3
解决办法
2万
查看次数

通过类别覆盖Objective c中的方法

以下是在目标c中工作:

// Base Class in ClassA.h and ClassA.m
@interface ClassA : NSObject 
- (NSString *) myMethod;
@end
@implementation ClassA
- (NSString*) myMethod { return @"A"; }
@end

//Category in ClassA+CategoryB.h and ClassA+CategoryB.m
@interface ClassA (CategoryB) 
- (NSString *) myMethod;
@end
@implementation ClassA (CategoryB)
- (NSString*) myMethod { return @"B"; }
@end
Run Code Online (Sandbox Code Playgroud)

问题是,如果我只是导入ClassA.h并发送消息

[myClassA myMethod]; //returns B
Run Code Online (Sandbox Code Playgroud)

这为什么会回归B?我没有导入ClassA + CategoryB

即便如此,如果我做了以下事情:

// Base Class in ClassA.h and ClassA.m
@interface ClassA : NSObject 
- (NSString *) myMethod;
- (NSString *) …
Run Code Online (Sandbox Code Playgroud)

objective-c categories ios

20
推荐指数
2
解决办法
2万
查看次数

如果两个ObjC类别覆盖相同的方法会发生什么?

我知道有关Objective-C类别的一些规则:

  1. 类别方法不应覆盖现有方法(类或实例)
  2. 对同一个类实现相同方法的两个不同类别将导致未定义的行为

我想知道当我覆盖同一类别中我自己的一个类别方法时会发生什么.例如:

@interface NSView (MyExtensions)
- (void)foo; // NSView category implementation
@end

@interface MyClass : NSView
{ }
@end

@interface MyClass (MyExtensions)
- (void)foo; // MyClass category implementation
@end
Run Code Online (Sandbox Code Playgroud)

定义了这些接口后,当我运行以下代码时将执行哪个方法?

MyClass * instance = [[MyClass alloc] initWith...];
[instance foo];
[instance release];
Run Code Online (Sandbox Code Playgroud)

注意:使用我的编译器,MyClass实现优先,但我不确定是否可以保证发生,或者只是一种特定的未定义行为.

methods inheritance cocoa objective-c categories

13
推荐指数
2
解决办法
6070
查看次数

使用具有相同方法名称的类别扩展类

我想使用类NSArray + Populate.h扩展一个类:

@interface NSArray (Populate)
-(NSArray *) populateArray; 
@end
Run Code Online (Sandbox Code Playgroud)

如果有另一个类别(来自另一个模块或库),使用具有相同名称的方法扩展NSArray,如何检测情况?

例如,如果有NSArray + Fill.h:

@interface NSArray (Fill)
-(NSArray *) populateArray; 
@end
Run Code Online (Sandbox Code Playgroud)

据我了解,运行时引擎会默默地选择其中一个版本,而不会发生任何崩溃?

iphone objective-c ios

3
推荐指数
1
解决办法
1212
查看次数

标签 统计

objective-c ×5

categories ×3

ios ×2

cocoa ×1

inheritance ×1

iphone ×1

methods ×1