aclass.h
@interface aClass : NSObject {
NSString *name;
}
@property (nonatomic, retain) IBOutlet NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)
aclass.m
@implementation aClass
@synthesize name;
- (void)dealloc {
[name release];
[super dealloc];
}
- (void)test1 {
name = @"hello";
}
- (void)test2 {
self.name = @"hello";
}
Run Code Online (Sandbox Code Playgroud)
以上面为例.可能有人请解释之间的差异name = @"hello"和self.name = @"hello"?谢谢!
我搜索了很多关于ObjC访问器和合成访问器的问题都无济于事.这个问题更像是"帮我解决问题"的问题; 我不期待一个答案,但我宁愿寻找专家来衡量这个论点.
在Cocoa Touch类中,我会写一些像这样的代码(其中soundEffects是一个合成的NSArray属性):
id foo = [self.soundEffects objectAtIndex:1];
Run Code Online (Sandbox Code Playgroud)
一位同事让我解释为什么上述内容比这一行更好:
id foo = [soundEffects objectAtIndex:1];
Run Code Online (Sandbox Code Playgroud)
好吧,功能上,它没有什么不同.
我对前者的论点如下:
self.soundEffects 告诉处理代码的所有其他编码人员,这是一个iVar,而不是本地范围的变量.
如果我们需要,我们可以在soundEffectsgetter访问器中放置自定义逻辑.
没有具体的理由,在Obj-C工作一年后,它"感觉"是正确的做法.
他接受参数#1和#2是有效的,但也给出了对应点:
这不仅仅是代码臃肿吗?
一个类不应该被允许直接与自己的iVars交谈,而不必自己调用方法(getter)吗?
任何接受者?
我已在本网站上阅读了有关此问题的一些问题,我理解以下内容:
self.property访问手动或@synthesize创建的getter/setter方法.根据属性是否声明为保留,复制等,保留计数被正确修改,例如保留属性,使用"保留"释放分配新值的先前值,并将保留计数增加1.
属性通常使用相同名称的实例变量声明(如果手动进行赋值,则可以不同).这通常是因为@synthesize生成的访问器使用实例变量引用内存中的对象,然后执行相关命令.
我的问题是基于这样一个事实:在许多例子中,self.property和property可以互换地用于不同的事情,我在确定规则时遇到了麻烦.Apple Docs中"食谱"示例应用程序中的一个示例包含以下内容:
self.navigationItem.title = recipe.name;
nameTextField.text = recipe.name;
overviewTextField.text = recipe.overview;
prepTimeTextField.text = recipe.prepTime;
Run Code Online (Sandbox Code Playgroud)
和...
self.ingredients = sortedIngredients;
Run Code Online (Sandbox Code Playgroud)
这些属性中的每一个都具有相同名称的关联私有实例变量.所有都以'nonatomic,retain'属性以相同的方式声明.每个都以dealloc发布...
然而,"成分"通过self访问,"prepTimeTextField"可以直接访问.
访问方法差异的原因是什么?
如果我正在访问视图的代理呢?或者是核心数据对象,它被前一个视图控制器作为保留属性传递给视图控制器?
非常感谢
是什么区别self.myVariable = obj;和myVariable = obj;,当我使用@propery/ @synthesize创建`MYVARIABLE?
以下代码是否调用访问器"set"函数或myMember直接修改指针?
aClass.h
@interface MyClass : NSObject {
NSArray *myMember;
}
@property (nonatomic, retain) NSArray *myMember;
Run Code Online (Sandbox Code Playgroud)
aClass.c
@implementation GameplayScene
@synthesize myMember;
- (id) init {
if ( (self = [super init]) )
{
myMember = [NSArray array];
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,我想知道是否setMyMember正在调用该方法,或者是否myMember正在直接修改指针.
同样,是否myMember = [NSArray array]相同self.myMember = [NSArray array]?
objective-c ×5
properties ×2
accessor ×1
class ×1
cocoa ×1
cocoa-touch ×1
getter ×1
ios ×1
iphone ×1
retain ×1
self ×1
setter ×1