Objective-C不带加减号的方法实例
前言
在Oc中,方法分为类方法和实例方法。
前置加号(+)的方法为类方法,这类方法是可以直接用类名来调用的,它的作用主要是创建一个实例。有人把它称为创建实例的工厂方法。
前置减号(-)的方法为实例方法,必须使用类的实例才可以调用的。
但看别人代码过程中,还会发现一种,不带加减号的方法。
@implementation MyViewController
void foo(){
printf("msg from foo...");
}
- (void)loadView {
[super loadView];
foo();
}
@end
这种是混搭的 C 代码。
当然当 C 方法写在 @implementation 内也是可以的,编译器会正确地处理。因为 C 方法严格来说不隶属于类,好的做法是始终写在类实现的外部。
void foo(){
printf("msg from foo...");
}
@implementation MyViewController
- (void)loadView {
[super loadView];
foo();
}
@end
C 中获取 Objective-C 的数据
但如果你以为将 C 代码写在 @implementation 内部就可以获取到类里面的数据,那是不现实的。
MyViewController.h
@interface MyViewController ()
@property NSString *someStr;
@end
MyViewController.m
@implementation MyViewController
// void foo() { printf(self.someStr); } // 🚨 Use of undeclared identifier '_someStr'
void foo() { printf(_someStr); } // 🚨 Use of undeclared identifier '_someStr'
- (void)loadView {
[super loadView];
self.someStr = @"some string...";
foo();
}
@end
正确的做法是将 Objective-C 的对象传递给 C 代码,这样在 C 中便有了一个对象的引用,数据就可以正常获取了。
MyViewController.h
@interface MyViewController : UIViewController
@property NSString *someStr;
- (void)myObjcMethod;
@end
MyViewController.m
void foo(MyViewController* obj) {
printf("%s\n", [obj.someStr UTF8String]);
[obj myObjcMethod];
}
@implementation MyViewController
- (void)loadView {
[super loadView];
self.someStr = @"some string...";
foo(self);
}
- (void)myObjcMethod {
NSLog(@"msg from my objc method");
}
@end
相关资源
Mixing C functions in an Objective-C class
accessing objective c variable from c function
总结
到此这篇关于Objective-C不带加减号方法的文章就介绍到这了,更多相关Objective-C不带加减号内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341