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
总结
栏 目:C代码
本文地址:http://www.codeinn.net/misctech/187473.html