嘿,我对Objective C编程很新,我被困住了。为什么我创建I函数时,它不能使用我为标签或textview等创建的变量。每当我在viewDidLoad函数中调用它们时,我都要做self。(variableName)或_(variableName)并且它不会让我在viewDidLoad函数之外执行此操作。有没有办法在它之外访问它们?
答案 0 :(得分:1)
为什么我创建I函数时,它不能使用变量I 为标签或文本视图等创建
首先,您需要区分函数和实例方法。在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
类可以包含这样的方法:
另一方面,函数不是任何类的一部分,使用C函数语法而不是Objective-C方法语法,并且未在@implementation
块中定义:
BOOL isMiddleAged(Person* person)
{
return (person.age > 30) && (person.age < 60);
}
你不能在函数中使用self
因为函数没有与对象关联,所以self
没有指向的东西。但是,您可以使用您知道的其他对象的属性,例如上面示例中的person.age
。
每当我在viewDidLoad函数中调用它们时,我都必须这样做 自我。(variableName)或_(variableName),它不会让我这样做 在viewDidLoad函数之外。
您必须访问视图控制器的属性。如上所述,self.(variableName)
是访问属性的方式。 _(variableName)
指的是存储属性值的变量(通常由编译器生成)。 (您通常不应直接在初始化方法和-dealloc
之外访问这些变量 - 而是使用属性访问器。)您可以在类的任何实例方法中使用这些属性,而不仅仅是-viewDidLoad
。您还可以使用指向对象的指针名称替换self
来访问其他对象的属性,就像我在person
中使用isMiddleAged()
一样。
答案 1 :(得分:0)
好像你正在使用autosythesized属性。使用Auto Synthesized属性,您无需@syhtesize对象。
在这种情况下,@sythesize object = _object;
将隐式实现。
因此,您可以使用self.object或_object访问对象。
您可以@synthesize以避免通过self.varName或_varName使用对象。您可以使用varName直接使用它。