相关疑难解决方法(0)

self.ivar和ivar之间的区别?

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"?谢谢!

编辑:后续问题:如何为ivar编写我自己的setter,即:self.ivar = ...?

iphone objective-c ios

39
推荐指数
3
解决办法
6662
查看次数

在iOS上的Objective-C中,使用合成getter时"self.foo"和"foo"之间的(样式)区别是什么?

我搜索了很多关于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)

好吧,功能上,它没有什么不同.

我对前者的论点如下:

  1. self.soundEffects 告诉处理代码的所有其他编码人员,这是一个iVar,而不是本地范围的变量.

  2. 如果我们需要,我们可以在soundEffectsgetter访问器中放置自定义逻辑.

  3. 没有具体的理由,在Obj-C工作一年后,它"感觉"是正确的做法.

他接受参数#1和#2是有效的,但也给出了对应点:

  1. 这不仅仅是代码臃肿吗?

  2. 一个类不应该被允许直接与自己的iVars交谈,而不必自己调用方法(getter)吗?

任何接受者?

getter setter properties objective-c

13
推荐指数
2
解决办法
4668
查看次数

何时使用'self'访问属性

我已在本网站上阅读了有关此问题的一些问题,我理解以下内容:

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"可以直接访问.

访问方法差异的原因是什么?

如果我正在访问视图的代理呢?或者是核心数据对象,它被前一个视图控制器作为保留属性传递给视图控制器?

非常感谢

properties objective-c self retain

7
推荐指数
1
解决办法
1413
查看次数

自变量和变量差异

是什么区别self.myVariable = obj;myVariable = obj;,当我使用@propery/ @synthesize创建`MYVARIABLE?

cocoa cocoa-touch objective-c declared-property

5
推荐指数
4
解决办法
2601
查看次数

Objective-C中的属性和访问器

以下代码是否调用访问器"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]

class objective-c accessor

0
推荐指数
1
解决办法
627
查看次数