嘿,我对 Objective C 编程很陌生,我被困住了。为什么当我创建函数时,它不能使用我为标签或文本视图等创建的变量。每当我在 viewDidLoad 函数中调用它们时,我必须执行 self.(variableName) 或 _(variableName)它不会让我在 viewDidLoad 函数之外这样做。有没有办法在它之外访问它们?
2 回答
为什么我创建函数时,它不能使用我为标签或文本视图等创建的变量。
一方面,您需要区分函数和实例方法。在 Objective-C 中,类可以具有实例变量(作为该类实例的一部分的变量)和实例方法(类似于与该类的实例相关联的函数)。类也可以有属性,这些属性的使用很像实例变量,因为它们是与对象关联的值,但它们是通过访问器方法访问的。另一方面,函数不属于任何类。因此,一个类有一个接口,其中声明了实例变量和方法,如下所示:
@interface Person : NSObject
{
NSString *firstName;
NSString *lastName;
}
@property (readonly) NSString *fullName;
@property (strong) NSArray *friends;
@property (assign) int age;
- (id)initWithFirstName:(NSString*)first lastName:(NSString*)last;
- (void)addFriend:(Person*)friend;
@end
还有一个实现,像这样:
@implementation Person
- (id)initWithFirstName:(NSString*)first lastName:(NSString*)last
{ /* code goes here */ }
- (void)addFriend:(Person*)friend
{ /* code goes here */ }
- (NSString *)fullName
{ return [NSString stringWithFormat:@"%@ %@", firstName, lastName; }
@end
实现中的那些东西是实例方法,如-
开头所表示的以及它们在@implementation
块中定义的事实。(如果它们有+
而不是-
,它们将是类方法而不是实例方法——我会让你在文档中了解这一点。)通过使用普通方法调用或点表示法调用适当的访问器方法来访问属性,所以如果你有:
Person *george = [[Person alloc] initWithFirstName:@"George" lastName:@"Bailey"]
所有这些都是有效的:
NSString *name1 = george.fullName;
NSString *name2 = [george fullName];
george.age = 45;
[george setAge:45];
int years1 = george.age;
int years2 = [george age];
另外,self
是指向“当前对象”的指针。您可以在实例方法中使用它,以便对象可以调用自己的方法并访问自己的属性。例如,Person
该类可以包含这样的方法:
- (NSString *)nameAndAge { NSString *nameAndAge = [NSString stringWithFormat:@"%@: %d", self.fullName, self.age]; }
另一方面,函数不是任何类的一部分,使用 C 函数语法而不是 Objective-C 方法语法,并且不在@implementation
块中定义:
BOOL isMiddleAged(Person* person)
{
return (person.age > 30) && (person.age < 60);
}
你不能self
在函数中使用,因为函数与对象没有关联,所以没有什么self
可以指向的。但是,您可以使用您知道的其他对象的属性,person.age
例如上面的示例。
每当我在 viewDidLoad 函数中调用它们时,我都必须执行 self.(variableName) 或 _(variableName) 并且它不会让我在 viewDidLoad 函数之外执行此操作。
您必须访问视图控制器的属性。如上所述,self.(variableName)
是访问属性的方式。_(variableName)
指存储属性值的变量(通常由编译器生成)。(您通常不应该在初始化方法之外直接访问这些变量,-dealloc
而是使用属性访问器。)您可以在类的任何实例方法中使用这些属性,而不仅仅是-viewDidLoad
. 您还可以通过替换self
为指向对象的指针的名称来访问其他对象的属性,就像我对 in 所做的person
那样isMiddleAged()
。
好像您正在使用自动合成属性。使用 Auto Synthesized 属性,您不需要 @syhtesize 对象。
@sythesize object = _object;
在这种情况下将被隐式实现。
因此,您可以使用 self.object 或 _object 访问对象。
您可以@synthesize 避免通过 self.varName 或 _varName 使用对象。您可以使用 varName 直接使用它。